Ich entwickle eine Anwendung, mit der Ingenieure einfache Abfragen einzelner Tabellen / Ansichten für unsere Datenbanken durchführen können, indem sie Datenbank, Tabelle, Felder auswählen.
Ich erhalte Informationen zur Verwendung des Dynamic LINQ Library-Beispiels für die dynamische Auswahl der Klauseln Select, Where und Order by zur Laufzeit, bin jedoch nicht sicher, wie die Tabellenauswahl zugeteilt werden soll.
Gibt es eine Möglichkeit, die "Von" -Tabelle zur Laufzeit dynamisch auszuwählen, und wenn Sie ein konkretes Beispiel geben oder mich auf jemanden hinweisen könnten, der dies getan hat?
Vielen Dank.
BEARBEITEN
Beide Antworten scheinen also dieselbe allgemeine Idee zu haben. Ich werde versuchen, das C # in VB umzuwandeln und es zum Laufen zu bringen.
Die erste Antwort wird in konvertiert
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
Aber es wirft mir einen Fehler auf, der besagt, dass Erweiterungsmethoden nur in Modulen definiert werden können. Aber wenn ich es in Modul-Tags einbinde, gibt es immer noch den gleichen Fehler.
Also habe ich es kompiliert, indem ich es in Modul-Tags eingewickelt und die Klassen-Tags entfernt habe. Ich kann auch die letzte Zeile herausziehen und diese direkt in meine Basismethode schieben, wodurch ich sie ausführen kann, aber sie scheint wieder leer zu sein. Wenn ich versuche, die Ergebnisse aufzuzählen, gibt es keine. Ich bin mir nicht sicher, ob dies mein Codeproblem oder das Problem mit den neuen Codes ist. Ich werde mehr testen.
Hier ist meine Konvertierung des zweiten Beispiels. Jetzt versuche ich zu sehen, ob ich sie zum Laufen bringen kann. Ich werde nach einigen Tests mit Fragen oder Ergebnissen zurück sein.
'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))
Danke für die Hilfe. BBL
Mit GetTable()
Sie die entsprechende ITable
Ihrer Daten ITable
. Dann gekoppelt mit der Verwendung von DLINQ , was es relativ einfach macht.
In diesem Beispiel wird die AdventureWorks
Datenbank verwendet. In meinem Projekt ist der Kontext in der DatabaseTest
Assembly im DatabaseTest.AdventureWorks
Namespace definiert.
'' 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)))
Im Nachhinein war die Verwendung von Reflektion möglicherweise der einfachere Weg, um die Tabelle abzurufen, da Sie den Namen bereits haben. Aber dann haben die Namen möglicherweise keine 1-zu-1-Korrespondenz, sodass Sie dies kompensieren müssen.
Dim table As ITable = dc.GetType().GetProperty(tableName & "s").GetValue(dc, Nothing)
Siehe Abrufen von Tabellendaten aus Tabellennamen in LINQ DataContext .
Dies ist wahrscheinlich besser mit direkten SQL-Anweisungen möglich. LINQ wird Ihnen nur in die Quere kommen.
VB-Konvertierung:
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
Verwendungszweck:
Dim myDataContext as New MyCustomDataContext
myDataContext.GetTableByName("ORDERS").Where("...")