实体框架 - LINQ - 在Select中使用表达式

问题描述 投票:1回答:1

我在我的代码中使用了一些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),
})

我想要实现的是在select中实际使用相同的表达式/函数来评估每一行。

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的方式,但无法找到它。

entity-framework linq linqkit
1个回答
1
投票

回答我自己的问题:)

正如@ 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方法中的函数。

© www.soinside.com 2019 - 2024. All rights reserved.