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