Linq 实体框架链接where子句
是否可以重构以下查询,以便在生成的sql中只保留一个查询(无子查询)时,只重构一次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 + " "
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
子句。类似于whenquery.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))));