【问题标题】:Entity Framework chained where clause实体框架链式 where 子句
【发布时间】:2011-10-21 02:02:50
【问题描述】:

是否可以重构以下查询,以便 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));

【问题讨论】:

    标签: linq entity-framework entity-framework-4.1


    【解决方案1】:
    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 or (extendedSearch and B)

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

    【讨论】:

    • 哦,是的,这是完全有效的,但是我希望找到不涉及创建一个巨大的where 子句的解决方案。 query.Where(x => x.Foo && x.Bar) 也可以写成 query.Where(x => x.Foo).Where(x => x.Bar)。这个例子很简单,但是参数多了就很难维护了:(
    • @Lukáš:我明白了。你知道 PredicateBuilder 吗?也许它可以帮助您达到目的:albahari.com/nutshell/predicatebuilder.aspx
    • 不!这正是我需要的。谢谢!
    【解决方案2】:

    我现在无法为自己验证此解决方案,但它一定是这样的(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);
    

    这就是你要找的吗?

    【讨论】:

    • 这可以在 linq to objects 中工作,但我需要这个 linq to 与 Expression> 一起工作的实体。无论如何谢谢:)
    猜你喜欢
    • 2011-12-31
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多