【发布时间】:2019-06-01 15:11:31
【问题描述】:
我有一个表达式返回方法如:
public Expression<Func<User, bool>> GetUserPredicate(int userID)
{
return u => u.ID == userID;
}
(在原始代码中,这是一段更长、更复杂的逻辑,我想重用它,因此我将其提取到这样的方法中。)
我可以毫无问题地在用户查询中使用它:
var user = dbContext.Users
.Where(GetUserPredicate(1))
.Single();
但我也想在查询 Posts 等其他实体时使用它:
var post = dbContext.Posts
.Where(p => p.ID == 1)
.Where(p.User => GetUserPredicate(1))
.Single();
但这不起作用。怎么实现?
【问题讨论】:
-
编译器是怎么说的?
-
@CodeNotFound p 在上下文中不存在
-
你应该使用
.Where(p => GetUserPredicate(1)而不是.Where(p.User => GetUserPredicate(1)) -
LinqKit 提供自定义扩展方法
Invoke与AsExpandable()一起使用。所以用法是var userPredicate = GetUserPredicate(1); var post = dbContext.Posts.AsExpandable.Where(p => userPredicate.Invoke(p.User)。 Nether C# 和 BCL 提供开箱即用的此类功能。
标签: c# entity-framework