У меня есть проект MVC3, использующий модель Entity Framework, в котором я размечал класс следующим образом:
public partial class Product
{
public bool IsShipped
{
get { /* do stuff */ }
}
}
и которое я хочу использовать в выражении LINQ:
db.Products.Where(x => x.IsShipped).Select(...);
однако я получаю следующую ошибку:
System.NotSupportedException не было обработано кодом пользователя. Сообщение = указанный член типа IsShipped не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, члены сущности и свойства навигации сущности . Source = System.Data.Entity
Я погуглил, но не нашел ничего окончательного об этом использовании, чтобы попытаться:
public partial class Product
{
public bool IsShipped()
{
/* do stuff */
}
}
db.Products.Where(x => x.IsShipped()).Select(...);
, но затем я получаю:
System.NotSupportedException не было обработано кодом пользователя Message = LINQ {{ 1}} to Entities не распознает метод Boolean IsShipped (), , и этот метод не может быть преобразован в выражение хранилища.
Source = System.Data.Entity
там есть функциональность, которую я не хочу встраивать в сам запрос LINQ ... как лучше с этим справиться?
* update *
Дарин справедливо указывает, что все, что делается в реализации IsShipped
, необходимо преобразовать в запрос SQL, и компилятор, вероятно, не знает, как это сделать, таким образом извлекая все объекты в память кажется единственным выбором (если не делается прямой запрос к базе данных).Я пробовал это так:
IEnumerable xp = db.Quizes
.ToList()
.Where(x => !x.IsShipped)
.Select(x => x.Component.Product);
, но он генерирует эту ошибку:
Произошло нарушение ограничения множественности отношений: EntityReference может иметь не более одного связанного объекта, но запрос вернулся более одного связанного объекта. Это неустранимая ошибка .
хотя, как ни странно, это работает:
IEnumerable xp = db.Quizes
.ToList()
.Where(x => x.Skill.Id == 3)
.Select(x => x.Component.Product);
почему это должно быть?
* update II *
извините, последний оператор тоже не работает ...
* update III *
I Я закрываю этот вопрос в пользу решения, предложенного здесь, чтобы упростить мою логику в виде запроса - обсуждение переместится в этот новый пост . Вторая альтернатива, извлечение всего исходного запроса в память, вероятно, неприемлема, но третья, реализация логики в виде прямого запроса к базе данных, еще предстоит изучить.
Спасибо всем за ценный вклад.