Linq 实体框架链接where子句

Linq 实体框架链接where子句,linq,entity-framework,entity-framework-4.1,Linq,Entity Framework,Entity Framework 4.1,是否可以重构以下查询,以便在生成的sql中只保留一个查询(无子查询)时,只重构一次i.Title.Contains(query)| | i.Description.Contains(query) if (extendedSearch) { result = result.Where(i => i.Title.Contains(query) || i.Description.Contains(query) || (i.CreatedBy.FirstName + " "

是否可以重构以下查询,以便在生成的sql中只保留一个查询(无子查询)时,只重构一次
i.Title.Contains(query)| | i.Description.Contains(query)

if (extendedSearch)
{
    result = result.Where(i => i.Title.Contains(query) || i.Description.Contains(query)
        || (i.CreatedBy.FirstName + " " + i.CreatedBy.LastName).Contains(query)
        || (i.AssignedTo.FirstName + " " + i.AssignedTo.LastName).Contains(query)
    );
}
else
    result = result.Where(i => i.Title.Contains(query) || i.Description.Contains(query));

我现在无法亲自验证此解决方案,但它必须是这样的(TI是您代码示例中的I类型):

Func predicate=i=>i.Title.Contains(查询)| | i.Description.Contains(查询);
如果(扩展搜索){
结果=结果。其中(i=>谓词(i)
||(i.CreatedBy.FirstName+“”+i.CreatedBy.LastName)。包含(查询)
||(i.AssignedTo.FirstName+“”+i.AssignedTo.LastName)。包含(查询)
);}else result=result.Where(谓词);
这就是你要找的吗

result = result.Where(i => 
    i.Title.Contains(query) || i.Description.Contains(query)
 || (extendedSearch && 
      ((i.CreatedBy.FirstName + " " + i.CreatedBy.LastName).Contains(query)
   ||  (i.AssignedTo.FirstName + " " + i.AssignedTo.LastName).Contains(query))));
(祈祷括号是正确的…)

Where表达式中的逻辑结构:A或(extendedSearch和B)


如果
extendedSearch
false,则结果仅取决于A。如果
extendedSearch
true则结果取决于(A或B)——我希望它表示查询中的逻辑。

这将在linq to对象中起作用,但我需要这一点,用于linq to与表达式一起工作的实体。无论如何,谢谢:)哦,是的,这是完全正确的,但是我希望解决方案不会涉及创建一个巨大的
where
子句。类似于when
query.Where(x=>x.Foo&&x.Bar)
也可以像
query.Where(x=>x.Foo.Where(x=>x.Bar)
那样编写。这个例子很简单,但是有了更多的参数就很难维护了:(@Lukáš:我明白了。你知道PredicateBuilder吗?也许它可以帮助你:不!这正是我需要的。谢谢!
result = result.Where(i => 
    i.Title.Contains(query) || i.Description.Contains(query)
 || (extendedSearch && 
      ((i.CreatedBy.FirstName + " " + i.CreatedBy.LastName).Contains(query)
   ||  (i.AssignedTo.FirstName + " " + i.AssignedTo.LastName).Contains(query))));