2009-04-14 6 views
1

ich eine Reihe von verschiedenen Datenquellen, die ich brauche, um meine alle Anfragen abzufragen und in der Lage gewesen zu tun zu beschränken. Ein Beispiel für eine typische Komplexität meiner Lamba Ausdrücke ist:Drehen sehr einfach Expression <Func <T, bool>> in SQL where-Klausel

b => b.user == "joe" && b.domain == "bloggs.com" 

Auf meinen Nicht-SQL-Datenquellen Ich bin ok, wie ich sie konvertieren kann Listen Objekt und eine LINQ-Abfrage wie verwenden:

public override T Get(List<T> assets, Expression<Func<T, bool>> whereClause) 
{ 
    return assets.Where(a => whereClause.Compile()(a)).FirstOrDefault(); 
} 

Mein Problem ist, wenn ich eine relationale Datenbank abfragen muss - ich bin nur wirklich mit Postgresql und MySQL beschäftigt - ich habe ein bisschen gekämpft. Ich habe nHibernate zu Linq "funktioniert", aber hatte einige Probleme, wo es stoppt und den Zugriff auf die Datenbank oder kann nicht schließen Verbindungen, typische Dinge von etwas in der Beta zu erwarten, so beschwere ich mich nicht.

Da meine Abfragen so einfach sind und ich bin froh, das SQL selbst zu erstellen, würde ich gerne wissen, ob es eine relativ schmerzlose Möglichkeit gibt, meine Ausdrücke in SQL-Where-Klauseln umzuwandeln.

Ich hatte eine schnelle Suche und fand einige Beispiele und natürlich gibt es bereits einige Linq-to-SQL-Engines, also weiß ich, dass es getan werden kann. Die Frage ist, ob es etwas ist, was ich an einem Tag oder weniger Aufwand aufbringen kann? Ich würde sagen, dass ich eine kompatible Linq-to-SQL-Bibliothek finden und den Test testen würde, vorausgesetzt, es funktioniert einwandfrei. Ich habe große Leistungsüberlegungen, so dass rohe SQL für mich vorzuziehen ist, anstatt durch ein ORM zu laufen.

+0

Haben Sie eine LINQ-Provider aufbauen wollen oder nur Lambda konvertieren where-Klauseln in SQL? –

+0

Ich möchte einfach einfache Where-Klauseln erstellen. Ich möchte keinen LINQ-Anbieter aufbauen, von dem ich weiß, dass es ein ernstes Unterfangen ist. – sipwiz

Antwort

0

Schreiben eines LINQ-Providers kann sehr schwierig sein. Ich würde vorschlagen, in diese Links suchen:

Linq Provider for MySql, Postgres, Oracle (Dies ist Open-Source)
Writing custom LINQ provider

+0

Ich habe mir DbLinq angesehen, bin aber etwas zögerlich, wenn ich eine andere Bibliothek einstecke und Performance- oder Zuverlässigkeitsprobleme erlebe. Trotzdem sieht es viel leichter aus als nHibernate, so dass es sich lohnen kann, überhaupt etwas Zeit zu investieren. – sipwiz

+0

Wow, DbLinq sieht wirklich veraltet aus. –

0

Basierend auf Ihren Kommentar, dass Sie nur eine SQL-WHERE-Klausel aus dem Lambda bauen wollen, lasst uns Schau dir die WHERE-Klausel an. Ich werde es im Kontext einer vollständigen SELECt-Anweisung verwenden, aber es ist das gleiche für Update und Löschen.

Ein Beispiel

SELECT * FROM b 
WHERE b.user == 'joe' AND b.domain == 'bloggs.com' 

Wie Sie sehen können, wird es sehr einfach sein, das zu bauen, wo Klausel:

Ich nehme an, dass b der Name der Tabelle ist. Sie haben dann nur:

  • alles abgeschnitten vor und einschließlich der "=>" Operator
  • Änderung alle Betreiber von Lambda zu SQL-Syntax: '==' wird '='.
  • ändern '& &' zu UND und '||' bis OR
  • Apostrophe ändern sich entsprechend (“->‚) in String-Operationen

Sie Klammern, um Ihre Logik verwenden Verwenden LIKE Strings in Strings finden einen Blick auf this site für Syntax der Have... Wo-Klausel.

Verwenden Zeichenfolge ersetzen, die Magie zu tun:

str = str.Replace("==", "="); 
+0

Das ist der Weg, den ich gerne vermeiden würde, aber das ist der Punkt, von dem ich weiter gegangen bin. Das Schöne an Linq in meiner Situation ist b.LastUpdate> DateTime.Now. Es wird keine Probs geben, die an dem Datum eine ToString machen, aber wenn ich anfangen sollte DateTime.Now in einer Zeichenkette zu finden, würde es chaotisch werden :(. – sipwiz

Verwandte Themen