【问题标题】:Compilation error when using expression in linq在 linq 中使用表达式时出现编译错误
【发布时间】:2016-09-08 10:44:11
【问题描述】:

我有一些类似的 linq 查询

  Expression<Func<sometable, bool>> whereClauseDynamic= t => true;

 if (#somecondition)
        whereClauseDynamic= t => t.ID == #somevalue;

 var temp= (from tax in db.sometable
              join x in db.y on #someid
              where trans.Finished >= start
              where trans.Finished <= end
              where whereClauseDynamic
               .................

如果我使用实体框架类型语法,这很好用

(from t in db.sometable
           .Where(t => t.Finished >= start)
           .Where(whereClauseLocation)
            .................

但在第一种情况下会引发编译错误

错误 CS0029 无法将类型“System.Linq.Expressions.Expression>”隐式转换为“bool”

错误 CS1662 无法将查询表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型

我错过了什么?

【问题讨论】:

    标签: c# entity-framework linq


    【解决方案1】:

    一个肮脏的技巧是对查询中的每个表使用默认(始终为真)表达式。并根据您的条件,将其中一个(或多个)更改为真正的 where 子句。在您的查询中,您默认将它们全部应用。

    Expression<Func<X, bool>> whereClauseDynamicX = t => true;
    Expression<Func<Y, bool>> whereClauseDynamicY = t => true;
    Expression<Func<Z, bool>> whereClauseDynamicZ = t => true;
    Expression<Func<someTable, bool>> whereClauseDynamicSomeTable = t => true;
    
    
    from tax in db.sometable.Where(whereClauseDynamicSomeTable )
    join x in db.x.Where(whereClauseDynamicX) on #someid
    /* Continue the query */
    

    另一种方式:

    根据条件构建查询,意思是:

    IQueryable<someTable> someTableQuery = db.sometable;
    IQueryable<X> xQuery = db.x;
    IQueryable<Y> yQuery = db.y;
    IQueryable<Z> zQuery = db.z;
    
    if(condition1)
        someTableQuery = someTableQuery.Where(x=> /* some condition */)
    //.
    //.
    //.
    
    
    var query = from tax in someTableQuery
                join x in xQuery
                /* REST */
    

    上述方法对性能没有任何负面影响,因为查询仅在枚举时执行(使用循环或其他方法,如ToList() - ToArray()

    【讨论】:

    • 什么是我的 where 条件不是从 #sometable 即第一个表派生的,而是取决于正在加入的表,例如在这种情况下是 x
    • @AnshulNigam 但是你指定的类型是Expression&lt;Func&lt;sometable, bool&gt;&gt;
    • 我的错,我现在改了
    • 它可以工作,但它会影响将要连接的行吗?
    • @AnshulNigam 绝对不是。如果您应用 where 子句,则可以过滤连接的表。如果默认为true,则不会影响它。它甚至在大多数提供商中都被丢弃了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多