У меня есть класс Post
который является моделью Entity Framework. Это содержит свойство как это:
public bool Showable {
get {
return this.Public && this.PublishedDate > DateTime.now
}
}
Я могу использовать его в запросе как это:
from p in db.Posts where p.Showable select p;
но когда у меня есть свойство, которое использует его, как это
public IEnumerable ShowablePosts {
get {
return from p in db.Posts where p.Showable select p;
}
}
затем я не могу сделать:
from p in ShowablePosts where p.Id > 42 select p;
Это говорит:
Указанный участник типа 'Showable' не поддерживается в LINQ к Объектам. Только инициализаторы, участники объекта и свойства навигации объекта поддерживаются.
К сожалению, Entity Framework просто не поддерживает вычисленные свойства (то есть свойство, которое возвращает вычисленное значение, а не ссылку на резервное поле), но оно может поддерживаться в будущем.
Вы можете сделать это, если запишете свойство как Выражение
, которое можно перевести в SQL.
Это немного сложно, потому что это общее решение сложной проблемы.
Общая идея такова: LINQ to Entities (например, все поставщики LINQ) не могут транслировать скомпилированный код, такой как ваше свойство, в SQL во время выполнения. LINQ to Objects может выполнить скомпилированный код, но не может преобразовать его. Но они могут переводить Выражение
. Итак, вы можете написать:
public static Expression<Func<Post, bool>> WhereActive
{
get
{
return p => p.Public && p.PublishedDate > DateTime.Now;
}
}
Затем вы можете написать:
public IEnumerable<Post> ShowablePosts
{
get
{
return db.Posts.Where(WhereActive);
}
}
... и LINQ to Entities сможет это перевести. Код в сообщении, на которое я ссылаюсь, обобщает эту идею.