gpt4 book ai didi

c# - C#/.NET Entity Framework 中的动态查询生成器

转载 作者:行者123 更新时间:2023-11-30 20:36:01 26 4
gpt4 key购买 nike

假设我们使用的是 EF6,db 是 EF DbContext。假设用户可以输入五个可能的查询:

  1. 购买年龄等于 10 岁的汽车。
  2. 购买年龄小于 10 岁的汽车。
  3. 购买年龄超过 10 岁的汽车。
  4. 购买年龄不等于 10 岁的汽车。
  5. 在任何年龄都可以得到汽车。
    enum Operator    {        EQUAL,        NOT_EQUAL,            LESS_THAN,         MORE_THAN,        ANY    };    var operator = //some user selected operator, out of the ones available in the enum above    var carAge = //int selected by user to specify desired age    List cars;     switch(operator)    {        case Operator.EQUAL         {            cars = db.Cars.Where(c=> c.Age == carAge).ToList();         }        case Operator.NOT_EQUAL         {            cars = db.Cars.Where(c=> c.Age != carAge).ToList();         }        case Operator.LESS_THAN         {            cars = db.Cars.Where(c=> c.Age  c.Age > carAge).ToList();         }        case Operator.ANY         {            cars = db.Cars.ToList();         }    }

我如何更有效地做到这一点?开关运算符看起来很傻。看起来像 this article正在回答问题,但我不完全理解。

我们在 dynamically building multiple queries 上确实有答案,但这是我想要的不同部分(如果问题是“用户可以搜索汽车年龄和里程,或两者都不搜索”,则适用)。

编辑:为了回应评论澄清,我的“目标”是任何标准搜索,使用汽车示例,用户将有许多字段,他们可以在其中选择运算符。他们可以使用任何、全部或不使用任何字段,例如

里程:运营商、值(value)
年份:运算符,值
品牌:(是/不是,例如),汽车品牌

最佳答案

    Expression<Func<T, bool>> Build<T, TProperty>(Expression<Func<T, TProperty>> property, Operator op, TProperty value)
{
if (op == Operator.ANY)
{
return e => true;
}

var left = property.Body; //you need to check if it's a valid property visit
var right = Expression.Constant(value);
BinaryExpression body;

switch (op)
{
case Operator.EQUAL:
body = Expression.Equal(left, right);
break;
case Operator.NOT_EQUAL:
body = Expression.NotEqual(left, right);
break;
case Operator.LESS_THAN:
//you'd better check if < operator is available for the type
body = Expression.LessThan(left, right);
break;
case Operator.MORE_THAN:
body = Expression.GreaterThan(left, right);
break;
default: throw new NotSupportedException();
}

return Expression.Lambda<Func<T, bool>>(body, property.Parameters[0]);
}

用法 var bmw = Build<Car, string>(c => c.Brand, Operator.EQUAL, "BMW");

关于c# - C#/.NET Entity Framework 中的动态查询生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37381540/

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