C# 实体框架:使用已知名称的属性对查询表应用筛选器

C# 实体框架:使用已知名称的属性对查询表应用筛选器,c#,entity-framework,reflection,C#,Entity Framework,Reflection,我想使用实体模型的属性来过滤结果 这是我通常使用的代码: db.Users.Where(ent => ent.Id > 5).ToList(); 但我只能通过其名称字符串(“Id”)或其PropertyInfo来访问该属性 这是我尝试使用的,但似乎不起作用: db.Users.Where(ent => (int) ent.GetType().GetProperty("Id").GetValue(ent,null) > 5).ToList(); 请注意,where子句可

我想使用实体模型的属性来过滤结果

这是我通常使用的代码:

db.Users.Where(ent => ent.Id > 5).ToList();
但我只能通过其名称字符串(“Id”)或其PropertyInfo来访问该属性

这是我尝试使用的,但似乎不起作用:

db.Users.Where(ent => (int) ent.GetType().GetProperty("Id").GetValue(ent,null) > 5).ToList();

请注意,where子句可能会变得更复杂,我可能会使用另一种属性类型(而不是int)。

您可以使用反射和/或表达式生成器来动态创建LINQ查询,但这是一个滑铁卢

只需打开属性名就可以应用正确的过滤器,这要简单得多

假设您有需要转换为LINQ查询的
字符串名称
字符串值
的示例:

string name = "Id";
string value = "5";
switch (propertyName)
{
    case nameof(User.Id):
        var id = int.Parse(value);
        return db.Users.Where(ent => ent.Id > id).ToList();
    case nameof(User.Name):
        return db.Users.Where(ent => ent.Name == value).ToList();
}

您可以做的一件事是使用属性名构建
Where
表达式,例如:

public static Expression GreaterThanExpression<T>(string propertyName, object valueToCompare)
{
    var entityType = typeof(T);

    var parameter = Expression.Parameter(entityType, "entity");

    var lambda = Expression.Lambda(
            Expression.GreaterThan(
                Expression.Property(parameter, propertyName),
                Expression.Constant(valueToCompare)
            )
        , parameter);

    return lambda;
}

如果您需要组合多个表达式,那么您应该看看这个。

您使用同一个对象ent两次。看起来很奇怪。
var result=b.Users.Where(GreaterThanExpression("Id",5)).ToList();