如何在LINQ中使用SQL命令的IN或NOT IN敘述
LINQ是微軟新一代的查詢語言,用來讓程式設計師不需要懂資料庫或SQL命令就可以對資料進行新增、查詢、修改及刪除,以LINQ TO SQL或是以LINQ TO Entity連接SQL SERVER,實際在執行時仍會被轉成ADO.NET,進而以標準TSQL語法來對資料進行異動,本文將介紹在LINQ中如何使用SQL的IN或NOT IN敘述來篩選資料。
以Northwind資料庫最單純的Region資料表為例,若只要篩選RegionID為1和3的資料,我們會以下列的TSQL敘述來達成這個需求:
1: SELECT *
2: FROM Region
3: WHERE RegionID IN (1,3)
若轉換成LINQ語法,有兩個必須注意的地方:
- LINQ中沒有IN敘述,必須使用Contains來替代。
- 在SQL命令IN之後掛號中的篩選項目(以上述程式碼為例就是1,3)必須以陣列方式表示。
有了上述觀念後我們可以將上述TSQL敘述轉成下列LINQ語法:
1: Sub Main()
2: Using NW As New DataClasses1DataContext()
3: Dim RegID As Integer() = {1, 3}
4: Dim query = From p In NW.Region _
5: Where RegID.Contains(p.RegionID)
6: Select p
7:
8: For Each item In query
9: Console.WriteLine(String.Format("RegionID={0},RegionDescription={1}", item.RegionID, item.RegionDescription))
10: Next
11: Console.WriteLine(NW.GetCommand(query).CommandText)
12: End Using
13: Console.Read()
14: End Sub
執行結果如下:
要做NOT IN也很簡單,只要在加個NOT即可,範例程式碼如下:
1: Sub Main()
2: Using NW As New DataClasses1DataContext()
3: Dim RegID As Integer() = {1, 3}
4: Dim query = From p In NW.Region _
5: Where Not RegID.Contains(p.RegionID)
6: Select p
7:
8: For Each item In query
9: Console.WriteLine(String.Format("RegionID={0},RegionDescription={1}", item.RegionID, item.RegionDescription))
10: Next
11: Console.WriteLine(NW.GetCommand(query).CommandText)
12: End Using
13: Console.Read()
14: End Sub
執行結果為:
參考資料: