2011-10-22 105 views
1

如何爲以下簡單搜索條件編寫動態Linq查詢? 1)StudentNumber 2)姓氏 3)姓氏和名字動態Linq查詢幫助?

//if (!String.IsNullOrEmpty(StudentNumber)) 
var results = (from s in Students    
       where s.StudentNumber == 1001 
       select s 
       ); 

//else if (!String.IsNullOrEmpty(LastName) & (String.IsNullOrEmpty(FirstName)) 

var results = (from s in Students    
       where s.LastName == "Tucker" 
       select s 
       ); 

//else if (!String.IsNullOrEmpty(LastName) & (!String.IsNullOrEmpty(FirstName))    
var results = (from s in Students    
       where s.LastName == "Tucker" && s.FirstName == "Ron" 
       select s 
       ); 
+0

請嘗試關注此主題。 http://stackoverflow.com/questions/2827446/linq-dynamic-query 問候。 –

回答

5

需要聲明任何個人查詢您的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構建的更大,因爲這個邏輯包含了全部,它不僅僅是我們有條件添加的邏輯。

+0

有沒有一種方法可以先構造WHERE子句並在沒有if ... else的情況下在Linq查詢中使用它? – rk1962

+0

@ rk1962,你認爲如何在不使用某種if/else結構(包括條件語句)的情況下有條件地構建'where'?你可以在EF/SQL的情況下構建一個'Func '(或'Expression >)並將其傳遞到你的查詢中,但這個想法是一樣的,它只是當你表達它時*的問題,而不是*如果*。 –

+0

我做了一些研究,並在這裏找到了類似的問題:http://stackoverflow.com/questions/798553/user-defined-filter-for-linq。我將閱讀動態Linq查詢庫文章http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx到看看它是否有幫助。謝謝! – rk1962