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链接中的代码概括了这个想法.