2009-04-03 10 views
4

Ich versuche, ein altes Projekt auf LINQ zu migrieren, aber ich habe ein ziemlich großes Problem festgestellt. Das Problem ist, dass wir dynamische Tabellen für die Suche Indizierung (CM-System mit dynamischen Attributen) haben. Der Suchindex enthält Spalten für jedes durchsuchbare Attribut {attribute_x, attribute_y, ...}. Nun ist das Problem, ich kann nicht statisch definieren, welche Spalten verfügbar sind (oder sogar welche Tabelle zu verwenden, wie wir Suchindizes teilen), also brauche ich eine Möglichkeit, dies im laufenden Betrieb zu tun.Verwenden von LINQ to SQL mit dynamischen Tabellen

Ich habe versucht, dynamische Ausdrücke zu verwenden, aber sie benötigen immer noch einen Typ, um den Ausdruck zu erstellen, und ich konnte keinen gültigen Typ durch Reflektion generieren. (Es scheint, dass keine MemberInfo generiert wird).

Ich könnte auch befriedigen mit nur in der Lage, einen Ausdruck für die Suche zu generieren (aber ich denke, das ist keine leichtere Aufgabe). Etwas in den Linien von

 
var mySearchIndex= db.GetTable(myTableType); 
var query = from p in db.Products from idx in mySearchIndex; 
query = query.Where(
"idx." + attributeName + " > 50.0 && 
idx." + attributeName + "

wäre wünschenswert.

Hat jemand eine Lösung für dieses Problem gefunden? Ich habe die letzten zwei Tage in Blogposts und Foren vergeblich gesucht.

Antwort

1

Möglicherweise möchten Sie Linq to Dataset versuchen:

LINQ to DataSet zwischengespeichert in einem DataSet Objekt, um es einfacher und schneller abfragen über Daten macht. Insbesondere LINQ to DataSet vereinfacht die Abfrage von ermöglicht es Entwicklern, Abfragen aus der Programmiersprache selbst, statt mit einer separaten Abfrage Sprache.

+0

Linq to Dataset sieht tatsächlich sehr interessant aus, aber soweit ich verstehe, kombiniert es nicht die Abfragen, sondern verarbeitet die Information Client-Seite? Dies würde erhebliche Auswirkungen auf die Leistung haben. Oder irre ich mich damit und es kombiniert tatsächlich die Abfragen? –

+0

Eine Idee, die ich hatte, war, wenn es irgendwie möglich ist, sql in ein Expression-Objekt zu injizieren, so dass ich einen Ausdruck injizieren konnte, wie er existiert (wähle 1 aus SearchIndex ...), aber ich konnte keinen Weg finden. –

+0

Sie haben Recht. Es behandelt die Prozesse auf der Client-Seite. – Keltex

1

Ich glaube nicht, dass es eine Lösung für diese Verwendung von LINQ gibt. Zumindest nicht, dass ich jemals gehört oder gefunden habe. LINQ bricht, wenn sich die Tabellenstruktur ändert und Sie das DataModel jedes Mal neu erstellen müssen.

Wenn ich falsch bin, bin ich bestrebt, davon zu hören. :)

1

Sie arbeiten außerhalb von Linq SQL-Design, aber ich denke, es könnte getan werden, wenn Sie wirklich müssen. Die beste Option zum Erkunden ist wahrscheinlich die XmlMappingSource, die Sie im Konstruktor Ihres Kontexts verwenden können. Ich hatte damit einige Erfolge, wenn es darum ging, table renaming im laufenden Betrieb zu handhaben.

Bei der Zuordnung von XML ist der Spaltenname actual in der Datenbank das Attribut "Name" des Spaltenelements, während die Klasseneigenschaft das Element ist. Wenn Sie dies in der XML-Datei ändern, sollte die entsprechende Abfrage entsprechend zugeordnet werden.

+0

Ich schaue mir das am Wochenende an, es klingt tatsächlich interessant. Ich möchte wirklich, dass dies durch LINQ wegen der Wartbarkeit des Codes funktioniert. Einige zusätzliche Hintergrundarbeit wäre auf jeden Fall die Mühe wert. –

+0

Ich habe gerade ein Projekt abgeschlossen, das diese Technik und das Zusammenfließen von Linq zu XML (zum Ändern der Mapping-XML) und Linq zu SQL (für die Daten) für eine leistungsstarke Kombination verwendet. –