2011-02-17 57 views
0

我正在開發一個應用程序,允許工程師通過選擇數據庫,表,字段來對我們的數據庫進行簡單的單表/查詢查詢。我該如何動態選擇我的表在運行時動態LINQ

我得到如何使用動態LINQ庫示例來提供在運行時動態選擇Select,Where和Order by子句,但我無法分配表選項。

有沒有辦法提供在運行時動態選擇「從」表,以及如果你怎麼能提供一些具體的例子或指向我的人的方向?

非常感謝你。


編輯


所以這兩個答案似乎在說同樣的總體思路。我將嘗試將C#轉換爲VB並使其工作。

第一個答案轉換爲

NotInheritable Class DataContextExtensions 
    Private Sub New() 
    End Sub 
    <System.Runtime.CompilerServices.Extension> _ 
    Public Shared Function GetTableByName(context As DataContext, tableName As String) As ITable 
     If context Is Nothing Then 
      Throw New ArgumentNullException("context") 
     End If 
     If tableName Is Nothing Then 
      Throw New ArgumentNullException("tableName") 
     End If 
     Return DirectCast(context.[GetType]().GetProperty(tableName).GetValue(context, Nothing), ITable) 
    End Function 
End Class 

,但它扔我的錯誤,指出擴展方法只能在模塊定義。 但是,當我將它包裝在模塊標籤中時,它仍會給出相同的錯誤。

所以我通過將它包裝在模塊標籤中並剝離類標籤來編譯它。另外,我可以將最後一行拉出來,直接插入我的基本方法中,該方法允許我執行它,但似乎是空的。當我試圖列舉結果時,沒有。不知道這是我的代碼問題還是新的代碼問題,我會測試更多。


這是我對第二個例子的轉換,現在我試着去看看我能否讓它們工作。經過一些測試後,我會回到問題或結果。

'get the table from a type (which corresponds to a table in your context) 
Dim dataContextNamespace = "My.DataContext.Namespace" 
Dim type = Type.[GetType](dataContextNamespace + tableName) 
Dim table = dc.GetTable(type 

'add where clauses from a list of them 
For Each whereClause As String In whereClauses 
    table = table.Where(whereClause) 
Next 

'generate the select clause from a list of columns 
Dim query = table.[Select]([String].Format("new({0})"), [String].Join(",", selectColumns)) 

感謝您的幫助。 BBL

回答

1

您可以使用GetTable()來獲得數據的相應ITable。再加上使用DLINQ,使其相對容易。

本示例使用AdventureWorks數據庫。我的項目具有在DatabaseTest.AdventureWorks名稱空間中的DatabaseTest程序集中定義的上下文。

'' need my database and DLINQ extensions up top 
Imports DatabaseTest.AdventureWorks 
Imports System.Linq.Dynamic 

'' sample inputs 
Dim dc = New AdventureWorksDataContext() 
Dim tableName = "Contact" 
Dim whereClauses() = {"FirstName = ""John"" OR LastName = ""Smith"""} 
Dim selectColumns() = {"FirstName", "LastName"} 

'' get the table from a type (which corresponds to a table in your database) 
Dim typeName = "DatabaseTest.AdventureWorks." & tableName & ", DatabaseTest" 
Dim entityType = Type.GetType(typeName) 
Dim table = dc.GetTable(entityType) 
Dim query As IQueryable = table 

'' add where clauses from a list of them 
For Each whereClause As String In whereClauses 
    query = query.Where(whereClause) 
Next 

'' generate the select clause from a list of columns 
query = query.Select(String.Format("new({0})", String.Join(",", selectColumns))) 

回想起來,使用反射可能是獲取表格的更簡單方法,因爲您已經有了名稱。但是,這些名稱可能沒有1對1的對應關係,因此您必須對其進行補償。

Dim table As ITable = dc.GetType().GetProperty(tableName & "s").GetValue(dc, Nothing) 
2

請參閱Get table-data from table-name in LINQ DataContext

這可能實際上更好地使用直接SQL語句完成。 LINQ只會阻礙你。

VB轉換:

NotInheritable Class DataContextExtensions 
    Private Sub New() 
    End Sub 
    <System.Runtime.CompilerServices.Extension> _ 
    Public Shared Function GetTableByName(context As DataContext, tableName As String) As ITable 
     If context Is Nothing Then 
      Throw New ArgumentNullException("context") 
     End If 
      If tableName Is Nothing Then 
       Throw New ArgumentNullException("tableName") 
      End If 
     Return DirectCast(context.[GetType]().GetProperty(tableName).GetValue(context, Nothing), ITable) 
    End Function 
End Class 

用法:

Dim myDataContext as New MyCustomDataContext 
myDataContext.GetTableByName("ORDERS").Where("...") 
+0

我想實現這個,但我該如何調用擴展方法?重要的是要注意,爲了讓代碼在VB中工作,我必須把它放在一個模塊中,並去掉類標籤。 – Neberu 2011-02-17 18:50:31

+0

查看上面的更改。不確定擴展方法在VB.Net中的工作方式與C#中的相同。 – mellamokb 2011-02-17 19:27:08