2009-09-30 194 views
7

我使用C#.NETLINQ WHERE使用if語句

我有兩個文本框,如果它!空需要一個LINQ查詢中的WHERE子句的一部分條款。

這裏是我的代碼

var result = from a in xxxx select a; 

if(!string.IsNullOrEmpty(personName)) 
{ 
    return result.Where(a >= a.forename.Contains(personName) || a.surname.Contains(personName)  
} 
else if(!string.IsNullOrEmpty(dateFrom)) 
{ 
    return result.Where(a >= a.appStartDateTime >= dateFrom.Date) 
} 
else if(!string.IsNullOrEmpty(personName) && !string.IsNullOrEmpty(dateFrom)) 
{ 
    return result.Where(a >= a.forename.Contains(personName) || a.surname.Contains(personName) && a.appStartDateTime >= dateFrom.Date); 
} 

我認爲這會工作,但它不喜歡的。哪裏,我不能訪問「A」例如a.forename(名稱「一個」不在當前的情況下存在)

我該怎麼做,或者實際上不能做到這一點?

在此先感謝您的幫助。

克萊爾

+1

如果你將永遠不會碰到最後的其他人。如果最後一個如果將是真的,那麼第一個如果是真的。所以你不能到最後一個。 – 2009-09-30 12:40:28

+0

我現在把它們變成了所有if語句。 – ClareBear 2009-09-30 13:43:25

+0

@ClareBear如果他們仍然有返回語句在他們那麼它不會幫助。你將永遠不會碰到檢查兩個條件的最後一條if語句。你仍然只會從第一個返回。我也會重新排序它們,以便personName && dateFrom的檢查不爲空或空的檢查首先發生。 – 2009-09-30 13:49:25

回答

6

取而代之的是:

result.Where(a.forename.Contains(personName)) 

試試這個:

result.Where(a => a.forename.Contains(personName)) 

你似乎缺少拉姆達操作符(=>)。

+0

我想我讀,因爲它位於一個if語句,它不能訪問任何東西之外,不知道如果這是真的嗎?由於我仍然得到「名稱」一個'在當前上下文錯誤中不存在「 – ClareBear 2009-09-30 11:00:59

+0

你能發佈你現在更新的代碼嗎? – RichardOD 2009-09-30 11:11:06

+0

我用更新後的代碼更新了我的問題。 – ClareBear 2009-09-30 11:23:01

1

..或者只有一個出口點:

var result = from a in xxxx select a; 

Func<string, bool> func = null; 

if(!string.IsNullOrEmpty(personName)) 
{ 
func = (a) => {a.forename.Contains(personName) || a.surname.Contains(personName)};  
} 

else if(!string.IsNullOrEmpty(dateFrom)) 
{ 
func = (a) => {a.appStartDateTime >= dateFrom.Date}; 
} 

else if(!string.IsNullOrEmpty(personName) && !string.IsNullOrEmpty(dateFrom)) 
{ 
func = (a) => {a.forename.Contains(personName) || a.surname.Contains(personName) && a.appStartDateTime >= dateFrom.Date;}; 
} 

return result.Where(func); 
2

試試這個


var result = from a in xxxx select a 
    where (string.IsNullOrEmpty(personName) || a.forename.Contains(personName) 
      || a.surname.Contains(personName)) 
      && (string.IsNullOrEmpty(dateFrom) 
      || a.appStartDateTime >= DateTime.Parse(dateFrom).Date); 

dateFrom似乎是一個字符串,所以你必須分析它獲得一個約會時間。

這個邏輯應該可以工作,但我還沒有測試過。我可能是錯的。

如果personName不爲null或爲空,您似乎只關心如果姓或名包含personName。因此,如果personName爲null或爲空或者fore或sur名稱包含人名,則可以重寫它以返回事物。自||以來運營商短路它不會檢查包含如果personName爲空或空。

2

您還可以結合謂詞,使邏輯更短,更易於閱讀:

var result = from a in xxxx select a; 

if (!string.IsNullOrEmpty(personName)) 
    result = result.Where(a => a.forename.Contains(personName) || a.surname.Contains(personName) 

if (!string.IsNullOrEmpty(dateFrom)) 
    result = result.Where(a >= a.appStartDateTime >= dateFrom.Date) 

return result; 

結合謂詞的這種方法適用與「AND」條件。如果您需要「或」條件,則需要多一點參與。值得慶幸的是,Joe Albahari創建了PredicateBuilder(作爲LINQKit的一部分),這對此非常有幫助。

希望這會有所幫助。