首页 > 解决方案 > LINQ - 按属性名称选择

问题描述

我有以下课程:

public class User
{
    public string userName { get; set; }
    public bool active { get; set; }
}

样本:

{
   userName: John,
   active: true
},
{
   userName: Mary,
   active: true
}

如何按属性名称查询“活跃”用户?这是我尝试过的,但我得到:

“无法翻译 LINQ 表达式……要么以可翻译的形式重写查询,要么通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync 的调用显式切换到客户端评估()"

Type t = typeof(User);
PropertyInfo p = t.GetProperty("active");

int totalActive = userContext.Users.Where(u => Convert.ToBoolean(p.GetValue(u)) == true).Count();

标签: c#entity-frameworklinqasp.net-core

解决方案


如果由于某种原因您需要动态执行此操作,则需要手动构建表达式树(检查Queryable.Where签名):

public class User
{
    public string userName {get;set;}
    public bool active {get;set;}
}

Type t = typeof(User);
PropertyInfo p = t.GetProperty("active");

var prmtr = Expression.Parameter(t);
var value = Expression.Constant(true);
var comprasion = Expression.Equal(Expression.Property(prmtr, p), value);
var expr = Expression.Lambda<Func<User, bool>>(comprasion, prmtr);

int totalActive = userContext.Users.Where(expr).Count();

推荐阅读