LINQ-To-Entities查询.Where子句未按预期过滤

时间:2010-11-14 22:43:36

标签: .net entity-framework linq-to-entities

我正在为我的学习做一个项目。在为我的应用程序构建搜索引擎期间,我结束了这样的代码:

public List<Document> FindDocument(string docName, Company company,
                                   Department departament, Worker worker, 
                                   DateTime? enterDate, DateTime? expDate, 
                                   State state)
{
    IQueryable<Document> query = context.Documents
                .Include(p => p.Department)
                .Include(p => p.Company)
                .Include(p => p.State)
                .Include(p => p.Workers); 
    if (docName != null)
        query.Where(p => p.DocumentName.Contains(docName));
    if (company != null)
        query.Where(p => p.Company.Equals(company));
    if (departament != null)
        query.Where(p => p.Department.Equals(departament));
    if (worker != null)
        query.Where(p => p.Workers.Contains(worker));
    if (enterDate.HasValue)
        query.Where(p => p.EnterDate.Equals(enterDate.Value));
    if (expDate.HasValue)
        query.Where(p => p.ExpDate.Equals(expDate.Value));
    if (state != null)
        query.Where(p => p.State.Equals(state));

    return query.ToList();              
}

搜索条件是可选的,因此我需要检查是否有任何条件为空。应用程序是这样的,如果不使用此标准,则其值为null。

此查询的问题在于它始终返回所有文档,而不仅仅是满足条件的文档。我在运行时使用调试器检查以确保如果指定了值,则会评估if语句体。

3 个答案:

答案 0 :(得分:3)

您的问题是您认为Enumerable.Where修改了现有查询。它没有 - 它返回一个新的查询。您需要将调用结果分配给Where变回query变量:

query = query.Where(p => ... );

答案 1 :(得分:3)

您需要更改声明:

query.Where(...)

query = query.Where(...)

否则你不会改变任何东西,只是在没有取结果的情况下调用函数

答案 2 :(得分:1)

您需要稍微修改一下代码。 LINQ不会修改集合,但会返回带有结果的新值。

query = query.Where(...)