在linq中使用表达式时出现编译错误

时间:2016-09-08 10:44:12

标签: c# entity-framework linq

我有一些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&gt;' 'bool'

     

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

我错过了什么?

1 个答案:

答案 0 :(得分:2)

一个肮脏的技巧是对查询中的每个表使用默认(始终为true)表达式。根据您拥有的条件,您可以将其中一个(或多个)更改为真实的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()