2009-02-11 104 views
1

有沒有在線學習c#2.0語言功能「謂詞」的好教程?學習謂詞的資源

我試圖瞭解如何使用謂詞的LINQ一起SQL修改我的查詢

什麼,我試圖做的是查詢客戶的表和過濾它的基礎上不斷變化的標準。例如

  • 找到誰擁有郵編= 90210
  • 找到誰是男性
  • 找到誰是男性,所有客戶的所有客戶所有的客戶>有郵政編碼= 90210

現在的我這樣做使用if/else語句,這感覺很不錯

也有可能,我將不得不添加其他過濾器,所以我想要一個靈活的解決方案,這個問題很容易擴展無線thout打破任何東西(開閉原則,我認爲)

+0

回覆您的評論 - 事實上,大多數LINQ操作具有「延遲執行」(沒有任何反應,直到你迭代它),讓您在「撰寫」一個逐步查詢 - 通過一系列步驟添加過濾器/排序/投影等。只有Count(),Max()等東西立即執行。 – 2009-02-11 23:41:25

回答

0

(順便說一句 - 與使用基於λ-謂詞LINQ到SQL是C#3.0/.NET 3.5,不C#2.0)

嘛,有什麼特別的你想做什麼?

謂詞只是過濾器(作爲委託或表達式);它們不直接允許您修改TSQL等,除非將它們與LINQ-to-SQL提供程序可以處理的函數(these)或UDF映射到數據上下文中作爲可組合函數(FunctionAttribute)映射到您的數據上下文中。

在最簡單的:

誰是男性,>有郵政編碼= 90210

var qry1 = from cust in ctx.Customers 
      where cust.Gender == 'M' && cust.Zip = '90210' 
      select cust; 

var qry2 = from cust in ctx.Customers 
      where cust.Zip = '90210' 
      select cust; 

或者用於非簡單的例子(一動態搜索表單/單獨組合)

IQueryable<Foo> query = ctx.Customers; 
// note "gender" here is "char?" for this example 
if(gender != null) query = query.Where(x=>x.Gender == (char)gender); 
if(zip != null) query = query.Where(x=>x.Zip == zip); 

您還可以手動構建基於表達式的謂詞,但這是更多的工作,並需要知道Expression API

+0

我想要做的是查詢客戶的表格,並根據更改標準對其進行過濾。例如 找到誰擁有郵編= 90210 找到誰是男性 找到誰是男性,所有客戶的所有客戶所有的客戶>有郵政編碼= 90210 現在我使用的if/else這感覺非常不對 – jorsh1 2009-02-11 19:41:59

1

謂詞可以簡單地通過以下的簽名的方法:

bool Predicate<T>(T item) 

它表示可由類型T的對象進行驗證或不是條件

它是在鏈路過濾可枚舉使用在.Where條款中。

您也可以使用返回一個布爾值的lambda表達式:

item => item.Nickname == "ThinkBeforeCoding";