如何在LINQ-to-Entities查询中使用自定义属性?

pup*_*eno 16 .net c# linq-to-entities entity-framework

我有一个类Post实体框架模型.它包含这样的属性:

public bool Showable {
  get {
    return this.Public && this.PublishedDate > DateTime.now
  }
}
Run Code Online (Sandbox Code Playgroud)

我可以在这样的查询中使用它:

from p in db.Posts where p.Showable select p;
Run Code Online (Sandbox Code Playgroud)

但是当我有一个使用它的属性时,就像这样

public IEnumerable<Post> ShowablePosts {
  get {
    return from p in db.Posts where p.Showable select p;
  }
}
Run Code Online (Sandbox Code Playgroud)

那我不能做:

from p in ShowablePosts where p.Id > 42 select p;
Run Code Online (Sandbox Code Playgroud)

它说:

LINQ to Entities不支持指定的类型成员"Showable".仅支持初始值设定项,实体成员和实体导航属性.

Cra*_*ntz 20

如果将属性编写为Expression可翻译为SQL 的属性,则可以执行此操作.

这是怎么做的.

这有点复杂,因为它是解决复杂问题的一般方法.

一般的想法是这样的:LINQ to Entities(像所有 LINQ提供者一样)无法在运行时将类似属性的编译代码转换为SQL.LINQ to Objects可以执行已编译的代码,但无法对其进行转换.但他们可以翻译一个Expression<T>.所以你可以写:

public static Expression<Func<Post, bool>> WhereActive
{
    get
    {
        return p => p.Public && p.PublishedDate > DateTime.Now;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以写:

public IEnumerable<Post> ShowablePosts 
{
    get 
    {
        return db.Posts.Where(WhereActive);
    }
}
Run Code Online (Sandbox Code Playgroud)

......和LINQ to Entities可以翻译它.帖子I链接中的代码概括了这个想法.


And*_*are 1

不幸的是,实体框架根本不支持计算属性(也就是说,返回计算值而不是对支持字段的引用的属性),但将来可能会支持它。