需要聲明任何個人查詢您的results
變量之外。這將允許您根據不同的標準附加不同的過濾器,並根據需要添加儘可能多的過濾器。一個例子:
var results = Students.AsEnumerable(); // use .AsQueryable() for EF or Linq-to-SQL
if (!string.IsNullorEmpty(StudentNumber))
{
results = results.Where(s => s.StudentNumber.Equals(StudentNumber));
}
else if (!string.IsNullOrEmpty(LastName))
{
results = results.Where(s => s.LastName.Equals(LastName));
if (!string.IsNullOrEmpty(FirstName))
{
results = results.Where(s => s.FirstName.Equals(FirstName));
// filter is in addition to predicate against LastName
}
}
// results can be used here
如果處理的LINQ到實體或-SQL,與Students.AsQueryable();
鍵入初始查詢,從而過濾發生在數據庫,而不是在應用程序內。
有沒有一種方法,我可以先構建WHERE子句,並用它在 Linq查詢,而不IF ... ELSE
如果你想建立之前,整個where
查詢的第一步,這是相同的邏輯。你有條件地構建謂詞,所以你會有某種if/else參與。但是,要首先構建整個謂詞,可以針對Linq to Objects構建一個Func<Student, bool>
。
Func<Student, bool> predicate;
if (!string.IsNullOrEmpty(StudentNumber))
{
predicate = s => s.StudentNumber.Equals(StudentNumber);
}
else if (!string.IsNullOrEmpty(LastName))
{
predicate = s => s.LastName.Equals(LastName);
if (!string.IsNullOrEmpty(FirstName))
{
Func<Student, bool> p = predicate;
predicate = s => p(s) && s.FirstName.Equals(FirstName);
}
}
else
{
predicate = s => true;
}
var query = Students.Where(predicate);
您會注意到它與if/else結構完全相同。你可以把它摺疊成一個複雜的條件表達式
Func<Student, bool> predicate;
predicate = s =>
!string.IsNullOrEmpty(StudentNumber)
? s.StudentNumber.Equals(StudentNumber)
: !string.IsNullOrEmpty(LastName)
? !string.IsNullOrEmpty(FirstName)
? s.LastName.Equals(LastName) && s.FirstName.Equals(FirstName)
: s.LastName.Equals(LastName)
: true;
var query = Students.Where(predicate);
但是我覺得很難跟得上,當然和if/else的時間長了一樣。這個謂詞也比我們通過if/else構建的更大,因爲這個邏輯包含了全部,它不僅僅是我們有條件添加的邏輯。
請嘗試關注此主題。 http://stackoverflow.com/questions/2827446/linq-dynamic-query 問候。 –