Dynamic LINQ – VB.NET

Dynamic LINQ – VB.NET

在寫LINQ的時候我們常常會碰到需要產生動態LINQ語法,像是Where的條件我們要程式中才能取得的話就必須在程式中兜出LINQ語法,那要如何做呢?

 

這有篇教學寫的很詳細,但在VB.NET我照他的寫法就是不行,可能是我功力不足。

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

 

後來自己Try一下,變成下列我改過的寫法。

 

首先的步驟跟上述網址上教的一樣,先下載Sample,這邊貼出VB版的網址:

VB Dynamic Query Library (included in the \Language Samples\LINQ Samples\DynamicQuery directory)

 

然後將下載資料夾底下 .\VS 2008 RTM VBSamples\VB 2008 RTM Samples\Language Samples\LINQ Samples\DynamicQuery\DynamicQuery

裡的Dynamic.vb加到要使用動態LINQ的專案。

 

如果是ASP.NET的專案要加到App_Code資料夾。如果是一般專案加入後要把裡頭的Namespace System.Linq.Dynamic,即用到此Namespace 的地方拿掉,不然會過不了。

 

拿上一個LINQ To ADO.NET的範例來做實驗。

 

假設使用者輸入三個搜尋條件,要搜尋3個名稱:


Dim userSelectNames As New List(Of String)
userSelectNames.Add("DEMO1")
userSelectNames.Add("DEMO2")
userSelectNames.Add("DEMO3")

 

動態兜出LINQ語法與指定對應的值:


Dim values(userSelectNames.Count - 1) As String

' 組成動態 LINQ 字串
For index As Integer = 0 To userSelectNames.Count - 1
    linqWhere = linqWhere & "TP_NAME =@" & index.ToString & " Or "
    values(index) = userSelectNames(index)
Next

 ' 把多餘的 Or 字串移除
linqWhere = linqWhere.Remove(linqWhere.Length - 4, 4)

 

下LINQ查詢:


Dim enumVersion = context.DEMO.Where(linqWhere, values)

 

PS. 一樣的例子,我把它改為對XML做Dynamic LINQ,但結果是不行,會出現查詢錯誤的例外,不知有無其他方法可以讓Dynamic LINQ用在查詢XML。