[英]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操作,例如,讓我所有員工在哪里:
這將是一個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.