Dynamic LINQ – VB.NET
在寫LINQ的時候我們常常會碰到需要產生動態LINQ語法,像是Where的條件我們要程式中才能取得的話就必須在程式中兜出LINQ語法,那要如何做呢?
這有篇教學寫的很詳細,但在VB.NET我照他的寫法就是不行,可能是我功力不足。
後來自己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。