C# 在linq中使用表达式时发生编译错误

C# 在linq中使用表达式时发生编译错误,c#,entity-framework,linq,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 #somei

我有一些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
               .................
但在第一种情况下抛出编译错误

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

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


我遗漏了什么?

一个肮脏的技巧是对查询中的每个表使用默认(始终为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 */
表达式,其中clausedynamicx=t=>true;
表达式,其中clausedynamicy=t=>true;
表达式,其中clausedynamicz=t=>true;
表达式,其中ClauseDynamicSomeTable=t=>true;
以db.sometable.Where(whereClauseDynamicSomeTable)表示的税款
在#someid上的db.x.Where(whereClauseDynamicX)中加入x
/*继续查询*/
另一种方式: 根据条件在途中构建查询,这意味着:

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 */
IQueryable someTableQuery=db.sometable;
IQueryable xQuery=db.x;
IQueryable yQuery=db.y;
IQueryable zQuery=db.z;
如果(条件1)
someTableQuery=someTableQuery.Where(x=>/*某些条件*/)
//.
//.
//.
var query=来自someTableQuery中的税务
在xQuery中加入x
/*休息*/

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

什么是我的where条件不是从#sometable(即第一个表)派生出来的,而是依赖于在这个表中加入x的表case@AnshulNigam但是您将类型指定为
Expression
my bad,我现在更改了它它可以工作,但是它会影响将要连接的行吗?@AnshulNigam绝对不会。如果应用where子句,则会过滤联接表。如果默认值为true,则不会影响它。它甚至在大多数提供者中被丢弃。
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 */