Поддержка членов типа в LINQ-to-Entities?

У меня есть проект 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 Я закрываю этот вопрос в пользу решения, предложенного здесь, чтобы упростить мою логику в виде запроса - обсуждение переместится в этот новый пост . Вторая альтернатива, извлечение всего исходного запроса в память, вероятно, неприемлема, но третья, реализация логики в виде прямого запроса к базе данных, еще предстоит изучить.

Спасибо всем за ценный вклад.

9
задан Community 23 May 2017 в 12:16
поделиться