Не удалось выполнить левое соединение

Я пытаюсь добавить функцию на свою страницу поиска. По сути, если определенное условие выполняется (основанное на соединении с другой таблицей), примените некоторый класс CSS. Вот мои (упрощенные) модели:

MyTable
int Key
string Someinfo1
string Someinfo2
string CssClass

SomeTable
int Key
string CssClass

Используя LINQ, я хочу объединить две таблицы и назначить SearchResult.CssClass = SomeTable.CssClass. На самом деле, для этого назначения используется некоторая логика.

var test = db.MyTable
    .GroupJoin(db.SomeTable,
                m => m.Key,
                s => s.Key,
                (m, s) => new {m, s})
    .SelectMany(x => x.h.DefaultIfEmpty(),
                (x, y) => new MyTable
                {
                    Key = x.m.Key,
                    Someinfo1 = x.m.Someinfo1,
                    Someinfo2 = x.m.Someinfo2,
                    CssClass = y.CssClass
                }

Этот код ломается, выдавая ошибку

The entity or complex type 'MyTable' cannot be constructed in a LINQ to Entities query.

Если я просто изменю кастинг (x, y) => new MyTable, чтобы создать анонимный тип (x, y) => new, тогда все будет работать так, как я ожидаю. Хотя мне нужно, чтобы это было типизировано как MyTable, чтобы быть совместимым с представлением, которое существует в настоящее время. Почему он ломается при попытке литья, если в остальном работает нормально? Кастинг постфактум тоже не работает. заранее спасибо

РЕДАКТИРОВАТЬ: Чтобы уточнить, MyTable сопоставляется с таблицей базы данных, за исключением CssClass. Я настроил EF, чтобы игнорировать этот элемент

modelBuilder.Entity<MyTable>().Ignore(m => m.CssClass);

Желаемое значение для MyTable.CssClass исходит из SomeTable.

DefaultIfEmpty() используется для включения всех записей в MyTable. Бывают случаи, когда ключ существует в MyTable, но не в SomeTable.


person Jeff    schedule 18.03.2013    source источник
comment
У меня проблемы с чтением этого. Вы намерены выполнить групповое соединение двух таблиц, чтобы затем спроецировать его обратно в объект одной из таблиц? Поскольку вы запрашиваете db.MyTable, а затем выбираете объект типа MyTable.   -  person Corey Adler    schedule 18.03.2013
comment
Кроме того, что такое x.h.DefaultIfEmpty? При чем тут h?   -  person Corey Adler    schedule 18.03.2013
comment
Добавил немного информации в конец вопроса. надеюсь, это поможет   -  person Jeff    schedule 18.03.2013


Ответы (1)


Как и говорится в ошибке, вы не можете создать новый экземпляр объекта из запроса.

Похоже, вы пытаетесь заменить свойство MyTable свойством SomeTable. Одним из недостатков этого решения является то, что новое значение CssClass будет сохранено обратно в MyTable, если объект будет сохранен (что может быть тем, что вы хотите, но это не похоже на ваше использование). Если вам действительно нужно это сделать, вам придется гидратировать объекты (например, с помощью ToList()), а затем циклически обновлять значение значением из связанного объекта.

Вероятно, лучше всего будет создать тип, независимый от вашего фактического класса сущностей, который используют ваши представления, а не связывать представления с вашим классом сущностей. Это добавляет некоторую работу для сопоставления двух классов, но вы можете избежать проблем, подобных той, с которой вы столкнулись. Одна проблема, которую я уже вижу в вашей модели данных: как узнать, следует ли сохранить значение CssClass обратно в MyTable или SomeTable?

person D Stanley    schedule 18.03.2013
comment
Я полагаю, что нет смысла делать это, хах. Меня опять берет лень. Я просто пытался найти обходной путь для создания другой ViewModel, поэтому я попробовал этот .Ignore мусор выше. - person Jeff; 18.03.2013
comment
К сожалению, каждый раз, когда у вас есть разница между вашей моделью хранения и нашей моделью представления, лучше не пытаться изменить модель хранения для использования в представлении. - person D Stanley; 18.03.2013