如何在LINQ中使用TSQL的IN或NOT IN

如何在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語法,有兩個必須注意的地方:

  1. LINQ中沒有IN敘述,必須使用Contains來替代。
  2. 在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

 

 

執行結果如下:

image

要做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

執行結果為:

image

 

 

 

參考資料: