在linq中使用表达式时出现编译错误
本文关键字:编译 错误 表达式 linq | 更新日期: 2023-09-27 18:06:07
我有一些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"。表达式>' to 'bool'
错误CS1662无法将查询表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型
我错过了什么?
一个肮脏的技巧是为查询中的每个表使用默认(总是true) Expression。根据您所拥有的条件,您将其中一个(或多个)更改为实际的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()
)