【问题标题】:Dynamic where condition in linq query expressionlinq 查询表达式中的动态 where 条件
【发布时间】:2013-12-30 19:26:57
【问题描述】:

我的代码:

IEnumerable<DataRow> whrRowEnum;
whrRowEnum  = from r in dtInput.AsEnumerable()
        where r.Field<string>("EMP_DEP") == "DEP1"
        orderby EMP_DEP
        select r;

由于硬编码的 where 条件,上面的代码工作正常,但在运行时我需要在我的 linq 查询中添加多个 where 条件,例如 r.Field("EMP_DEP") == "DEP1" && r.Field ("EMP_ID") == "EMP1"

【问题讨论】:

    标签: linq dynamic expression where


    【解决方案1】:

    您可以使用 lambda 语法根据条件编写查询:

    IEnumerable<DataRow> query = dtInput.AsEnumerable();
    
    if (condition1)
       query = query.Where(r => r.Field<string>("EMP_DEP") == "DEP1");
    
    if (condition2)
       query = query.Where(r => r.Field<string>("EMP_ID") == "EMP1");
    
    var whrRowEnum = query.OrderBy(r => r.Field<string>("EMP_DEP"));
    

    另一种选择是向查询过滤器添加条件

    whrRowEnum  = from r in dtInput.AsEnumerable()
                  where (!condition1 || (r.Field<string>("EMP_DEP") == "DEP1")) &&
                        (!condition2 || (r.Field<string>("EMP_ID") == "EMP1"))
                  orderby EMP_DEP
                  select r; 
    

    【讨论】:

    • 它应该是(!condition1 || (...)) &amp;&amp; (!condition2 || (...)) 或者如果条件1 或2 为假,则where 子句等于假。
    • @Sergey 对于第二个选项,有没有办法将该条件块外包给方法/函数?
    • @ibubi 你可以使用任何你想要的东西——唯一的条件是布尔输出。所以where IsFoo(r) 完全没问题。但在那种情况下,我会坚持方法语法rows.Where(IsFoo) 更具可读性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多