簡體   English   中英

過濾條件使用LINQ進行搜索

[英]Filter Criteria Search using LINQ

我對LINQ查詢“更新”有另外一個問題,我有什么事情要發生但不確定這是否是最有效的方法。 在我的項目中,我在一個真正的數據庫中工作,但為了簡單起見,我將把它簡化為一個簡單的員工列表:

var employees = new List<Employee>
        {
            new Employee { Id = 0, firstName = "James", LastName = "Bond", Manager = "M", StartDate = DateTime.Now },
            new Employee { Id = 1, firstName = "Eric", LastName = "Bond", Manager = "M", StartDate = DateTime.Now },
            new Employee { Id = 2, firstName = "Sue", LastName = "Milton", Manager = "Q", StartDate = DateTime.Now },
            new Employee { Id = 3, firstName = "Olivia", LastName = "Milton", Manager = "M", StartDate = DateTime.Now },
            new Employee { Id = 4, firstName = "Alice", LastName = "Raymond", Manager = "M", StartDate = DateTime.Now },
            new Employee { Id = 5, firstName = "James", LastName = "Skywalker", Manager = "M", StartDate = DateTime.Now },
            new Employee { Id = 6, firstName = "Luke", LastName = "Skywalker", Manager = "M", StartDate = DateTime.Now },

        };

我必須根據給定的標准在此列表中進行搜索..其中,條件是各種字段與OR的組合以及在字段中的AND操作,例如,讓我所有員工在哪里:

  • firstName =“James” “eric” AND manager =“Q”
  • lastname =“bond” “Martha”
  • firstName =“James” AND Lastname =“Bond”等等......

這將是一個Web API調用,我必須在一個方法中執行此操作。 另一個挑戰是每個搜索參數都是“可選的”,即,他們可以傳遞一個名字和管理員名稱的列表,並忽略姓氏參數等。所以這是我開始編碼的:

    public IList<Employee> GetFilteredEmployees(IList<String> firstnames = null,
                                                IList<String> lastnames = null,
                                                IList<String> managers = null)
    {
    if (firstnames != null && firstnames.Any())
     {
          foreach (var fn in firstnames)
          {
             employeeByFn = employees.Where(emp => emp.firstName == fn).ToList<Employee>();
          }

      }

     if (lastnames != null && lastnames.Any())
     {
         foreach (var ln in lastnames)
         {
             employeeByLn = employees.Where(emp => emp.LastName == ln).ToList<Employee>();
         }
      }

     ..... // code ellided
    }

正如您所看到的,即使使用一些搜索條件參數,這也會變得很難看。 在我的真實項目中,我有多達16個。 同樣在所有這些子查詢的最后,我必須將我的結果合並到一個員工列表中並返回,請記住任何子查詢結果可能為空。

我確信這不是一個獨特的問題,我看到之前提出的類似問題,但不是完全相同的問題。 這樣做的優雅方式也很容易維護。如果他們決定稍后添加更多搜索條件(比如開始日期),我希望能夠輕松修改我的方法來處理它。

非常感謝一群人。

您可以繼續在同一結果上添加Where()條件,而不是創建許多部分結果。

public IList<Employee> GetFilteredEmployees(IList<String> firstnames = null,
                                            IList<String> lastnames = null,
                                            IList<String> managers = null)
{
    IQueryable<Employee> result = employees;

    if (firstnames != null)
        result = result.Where(emp => firstnames.Contains(emp.firstName));

    if (lastnames != null)
        result = result.Where(emp => lastnames.Contains(emp.LastName));

    if (managers != null)
        result = result.Where(emp => managers.Contains(emp.Manager));

    ... // code ellided

    return result.ToList();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM