【发布时间】:2018-01-10 17:20:10
【问题描述】:
我在我的代码中使用了一些 EF LINQ 表达式来将我的模型的复杂查询保存在一个地方:
public static IQueryable<User> ToCheck(this IQueryable<User> queryable, int age, bool valueToCheck = true)
{
return queryable.Where(ToBeReviewed(age, valueToCheck));
}
public static Expression<Func<User, bool>> ToCheck(int age, bool valueToCheck = true)
{
return au => au.Status == UserStatus.Inactive
|| au.Status == UserStatus.Active &&
au.Age.HasValue && au.Age.Value > age;
}
然后我可以在查询中使用它们:
var globalQuery = db.Users.ToCheck(value);
还有在选择中:
var func = EntityExtensions.ToCheck(value);
var q = db.Department.Select(d => new
{
OrdersTotal = d.Orders.Sum(o => o.Price),
ToCheck = d.Users.AsQueryable().Count(func),
})
我想要实现的是实际使用相同的表达式/函数在一个选择中,为每一行评估它。
var usersQuery = query.Select(au => new {
Id = au.Id,
Email = au.Email,
Status = au.Status.ToString(),
ToBeChecked = ???, // USE FUNCTION HERE
CreationTime = au.CreationTime,
LastLoginTime = au.LastLoginTime,
});
我很高兴这将是一种使用普通 EF 功能或 LINQKit 的方法,但找不到它。
【问题讨论】:
-
你能解释一下
db.Department.Select(d => new { OrdersTotal = d.Orders.Sum(o => o.Price), ToCheck = d.Users.AsQueryable().Count(func), })和你想要什么之间的区别吗? -
第一个示例用作查询集合的函数,最后一个示例是我想在特定行上重用我的函数以获取其值的地方
-
你能添加你想要调用的示例函数吗?
-
示例函数是最后一个,之前的调用用于过滤或计数实体。最后一个是查询和检索每一行的值本身
-
看看
AsExpandable和Invoke自定义扩展方法。像query.AsExpandable().Select(.... ToBeChecked = func.Invoke(au))这样的东西。另一个例子 - stackoverflow.com/questions/38398507/…
标签: entity-framework linq linqkit