Entity Framework - LINQ - 在 Select 中使用表达式
Entity Framework - LINQ - Use Expressions in Select
我在我的代码中使用了一些 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);
还有 selects:
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),
})
我想要实现的是在 select 中实际使用相同的 expression/function 来评估每一行。
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,但找不到它。
回答我自己的问题:)
正如@ivan-stoev所指出的,使用Linqkit是解决方案:
var globalQueryfilter = db.Users.AsExpandable.Where(au => au.Department == "hq");
var func = EntityExtensions.ToCheck(value);
var usersQuery = globalQueryfilter.Select(au => new
{
Id = au.Id,
Email = au.Email,
Status = au.Status.ToString(),
ToBeChecked = func.Invoke(au),
CreationTime = au.CreationTime,
LastLoginTime = au.LastLoginTime,
});
return appUsersQuery;
需要使用来自 Linqkit 的 AsExpandable 扩展方法以及 Invoke select 方法中的函数。
我想再补充一个例子:
Expression<Func<AddressObject, string, string>> selectExpr = (n, a) => n == null ? "[no address]" : n.OFFNAME + a;
var result = context.AddressObjects.AsExpandable().Select(addressObject => selectExpr.Invoke(addressObject, "1"));
此外,表达式在助手中可以是静态的。
p.s。请不要忘记添加“使用 LinqKit;”并使用“AsExpandable”。
我在我的代码中使用了一些 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);
还有 selects:
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),
})
我想要实现的是在 select 中实际使用相同的 expression/function 来评估每一行。
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,但找不到它。
回答我自己的问题:)
正如@ivan-stoev所指出的,使用Linqkit是解决方案:
var globalQueryfilter = db.Users.AsExpandable.Where(au => au.Department == "hq");
var func = EntityExtensions.ToCheck(value);
var usersQuery = globalQueryfilter.Select(au => new
{
Id = au.Id,
Email = au.Email,
Status = au.Status.ToString(),
ToBeChecked = func.Invoke(au),
CreationTime = au.CreationTime,
LastLoginTime = au.LastLoginTime,
});
return appUsersQuery;
需要使用来自 Linqkit 的 AsExpandable 扩展方法以及 Invoke select 方法中的函数。
我想再补充一个例子:
Expression<Func<AddressObject, string, string>> selectExpr = (n, a) => n == null ? "[no address]" : n.OFFNAME + a;
var result = context.AddressObjects.AsExpandable().Select(addressObject => selectExpr.Invoke(addressObject, "1"));
此外,表达式在助手中可以是静态的。 p.s。请不要忘记添加“使用 LinqKit;”并使用“AsExpandable”。