Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ-按属性名称选择_C#_Entity Framework_Linq_Asp.net Core - Fatal编程技术网

C# LINQ-按属性名称选择

C# LINQ-按属性名称选择,c#,entity-framework,linq,asp.net-core,C#,Entity Framework,Linq,Asp.net Core,我有以下课程: public class User { public string userName { get; set; } public bool active { get; set; } } 样本: { userName: John, active: true }, { userName: Mary, active: true } 如何按属性名称查询“活动”用户? 这是我尝试过的,但我得到: 无法翻译LINQ表达式…请以可以翻译的形式重写查询,

我有以下课程:

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

{
   userName: John,
   active: true
},
{
   userName: Mary,
   active: true
}
如何按属性名称查询“活动”用户? 这是我尝试过的,但我得到:

无法翻译LINQ表达式…请以可以翻译的形式重写查询,或者通过插入对AsEnumerable()、AsAsAsAsyncEnumerable()、ToList()或ToListSync()的调用显式切换到客户端计算


正如错误所说,在尝试筛选Where子句中的数据之前,需要调用AsEnumerable()

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

int totalActive = userContext.Users.AsEnumerable().Where(u => Convert.ToBoolean(p.GetValue(u)) == true).Count();
这是因为linq将尝试将表达式转换为sql查询,而您正在where语句上使用函数,linq将无法转换此表达式,因为该函数在sql上不存在


AsEnumerable()将强制查询运行并将数据拉入内存,然后c#将应用筛选。

如果出于某种原因需要动态执行此操作,则需要手动生成(检查签名):

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();
公共类用户
{
公共字符串用户名{get;set;}
公共bool活动{get;set;}
}
类型t=类型(用户);
PropertyInfo p=t.GetProperty(“活动”);
var prmtr=表达式参数(t);
var值=表达式常数(真);
var comprasion=Expression.Equal(Expression.Property(prmtr,p),value);
var expr=表达式Lambda(压缩,prmtr);
int totalActive=userContext.Users.Where(expr.Count();
这是一个关于我的问题

由于在sql server端无法识别的where条件中使用了一些方法,因此可以将所有当前linq转换为客户端执行

这就是将
AsEnumerable()
ToList()
添加到
userContext.Users

例如:

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

另一种方法是,您还可以将所有linq语句转换为sql server-side可识别的语句来执行,正如上面提供的答案所示。

编译时您不知道属性的名称吗?为什么呢?无论如何,客户端评估应该按照消息的建议进行(例如,
userContext.Users.ToList()。其中(…)
)。First
active
不是一个属性。。。这是一个领域
GetProperty
找不到它。第二当
u
t
是同一类型时,为什么需要反射。@LegacyCode-嗯,这是一个自动属性。@Minecraft当我回复它时,它不是。janzen将其更改为autoproperty。如果将其用于数据库,我会非常犹豫,尤其是在Users表有大量行的情况下。。
int totalActive = userContext.Users.Where(u => u.active).Count();
int totalActive = userContext.Users.AsEnumerable().Where(u => Convert.ToBoolean(p.GetValue(u)) == true).Count();