2011-08-05 28 views
2

是否有可能重构以下查询所以i.Title.Contains(query) || i.Description.Contains(query)只有一次,而留在单一的查询(没有子查询)在生成的SQL?实体框架链接在哪里条款

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)); 

回答

4
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)))); 

(保持手指穿过托架是正确...)在

逻辑结构,其中表达:A或(extendedSearch和B)

extendedSearch如果是假结果仅取决于A。如果extendedSearchtrue结果取决于(A或B) - 它代表您的查询中的逻辑,我希望。

+0

哦,是的,这是完全有效的,但我希望解决方案不涉及创建一个巨大的'where'子句。像'query.Where(x => x.Foo && x.Bar)''时可以写成类似于'query.Where(x => x.Foo).Where(x => x.Bar)''。这个例子很简单,但有了更多的参数,它很难维护:( –

+0

@Lukáš:我知道了。你知道PredicateBuilder吗?也许它可以帮助你达到目的:http://www.albahari.com/nutshell/ predicatebuilder.aspx – Slauma

+0

不,这正是我需要的,谢谢! –

1

我不能马上验证该解决方案为我自己,但它必须是类似的东西(TI是你的代码样本中的I型):

Func<TI, Boolean> predicate = i => i.Title.Contains(query) ||i.Description.Contains(query); 

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

是,你是什么寻找?

+0

这将工作在linq的对象,但我需要这个linq的实体与表达式>。谢谢:) –