2010-11-14 83 views
1

我正在为我的研究项目。在施工过程中对我的应用程序搜索引擎,我的代码结束这样的:LINQ-to-Entities查询与.Where子句不按预期过滤

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

搜索条件是可选的,所以我需要检查是否有任何的标准是空值。应用程序是这样做的,如果这个标准没有被使用,那么它的值是空的。

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

回答

3

您需要更改语句:

query.Where(...) 

query = query.Where(...) 

否则你没有改变任何东西,只是调用一个函数而没有得到结果

+0

geez im so stupid:P我需要睡一会儿!大THX – Pax0r 2010-11-14 22:48:11

3

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

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

你需要稍微修改你的代码。 LINQ不修改集合,但返回一个新值和结果。

query = query.Where(...)