【问题标题】:LINQ-To-Entities query with .Where clauses not filtering as expected使用 .Where 子句未按预期过滤的 LINQ-To-Entities 查询
【发布时间】:2023-03-11 11:52:01
【问题描述】:

我正在为我的学习制作一个项目。在为我的应用程序构建搜索引擎期间,我以如下代码结束:

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 语句体。

【问题讨论】:

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


    【解决方案1】:

    您需要更改语句:

    query.Where(...)
    

    query = query.Where(...)
    

    否则你不会改变任何东西,只是调用一个函数而不获取结果

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        您需要稍微修改您的代码。 LINQ 不会修改集合,而是在结果中返回一个新值。

        query = query.Where(...)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-03
          • 1970-01-01
          • 1970-01-01
          • 2012-02-25
          • 1970-01-01
          • 2019-09-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多