gpt4 book ai didi

entity-framework - Entity Framework - LINQ - 在选择中使用表达式

转载 作者:行者123 更新时间:2023-12-04 16:07:24 25 4
gpt4 key购买 nike

我在我的代码中使用了一些 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,但找不到它。

最佳答案

回答我自己的问题:)

正如@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;

需要使用 LinqkitAsExpandable 扩展方法以及带有 select 方法中函数的 Invoke

关于entity-framework - Entity Framework - LINQ - 在选择中使用表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48192827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com