2010-12-14 13 views
1

Lassen Sie uns sagen, dass ich eine der folgenden Abfrage haben:Unterschall - konvertiert eine Linq-Abfrage auf SQL-Abfrage/Datareader

int x = 5; 
var result = from p in db.products 
      where p.CategoryId == x 
      select p; 

int count = result.Count(); 
List<product> products = result.ToList(); 

Das ist, was ich jetzt habe. Aber Aditionally muß ich aus dem Ergebnis einen Datareader haben:

// that's what I need: 
var reader = ConvertSubSonicLinqQueryToDataReader(result); 

Wie kann ich die Linq-Anweisung etwas umwandeln kann ich mit der Arbeit? Ein DataReader oder ein DbCommand oder auch nur SQL mit einer Liste von Parametern.

Ich weiß, SubSonic kann das tun (da es die Abfrage sowieso in plain sql übersetzt), aber ich habe noch nichts in den öffentlich zugänglichen Methoden gefunden.

Irgendwelche Vorschläge?

+0

Was möchten Sie mit dem DataReader machen? Vielleicht können wir Ihnen stattdessen etwas vorschlagen. –

+0

Ich muss einen DataReader an eine Methode eines Drittanbieters übergeben (es wäre ausreichend, die linq-Abfrage zu einer einfachen SQL-Anweisung zu kompilieren, damit ich eine InlineQuery verwenden kann) –

Antwort

1

Das Konvertieren der LINQ-Abfrage ist der falsche Ansatz. LINQ gibt Ergebnisse auf einer Abstraktionsebene zurück, die höher ist als bei einem DataReader.

Es gibt auch das Problem der verzögerten Ausführung, so dass Ihre LINQ-Abfrage sowieso nicht als einzelne SQL-Anweisung ausgeführt wird.

Rater als verwenden Sie eine LINQ-Anweisung, warum nicht einfach eine SqlQuery stattdessen verwenden?

var qry = new Select().From(Product.Schema).Where(Product.CategoryIdColumn).IsEqualTo(x); 

return qry.ExecuteReader(); 

Edit:
Gerade gesehen Sie verwenden Subsonic3 (nicht 2 wie oben Code wäre für), aber die möglichen Missbrauch von LINQ und Doppelarbeit noch steht.

+0

Ich weiß, dass eine Linq-Abfrage in erster Linie ein Ausdruck ist ausgeführt, wenn nötig (deshalb habe ich in meinem Beispiel zwei Anweisungen, 'Count()' und 'ToList()' eingefügt, was zu zwei verschiedenen Abfragen führt). SubSonic muss die Fähigkeit haben, einen bestimmten IQuerable in etwas wie einen 'IDataReader' oder' IDbCommand' umzuwandeln, denn am Ende des Tages muss subsonic es gegen ein dbms ausführen. Vielleicht ist diese Methode nicht in der öffentlichen Schnittstelle atm, aber ich bin mir sicher, dass ich es irgendwie herausfinden werde. Übrigens. Es ist schwer zu erklären, aber ich kann das Abfragetool nicht verwenden, weil ich das IQerable aus einer anderen Quelle bekomme. –

+0

@SchlaWiener Um einen 'IQueryable ' in einen' IDataReader' zu verwandeln, muss man sich etwas durch die Quelle von 'SubSonic.core' quälen. Ich würde damit beginnen, 'SubSonic.Linq.Strucutre.QueryCompiler' und' SubSonic.SqlGenerator' zu betrachten. –

0

Der Code, der Objekt aus dem DataReader erstellt, kann in DbDataProvider.ToEnumerable gefunden werden. Es wird von Execute-Methode von DbQueryProvider aufgerufen (Zeile 227). Der beste Weg, die LINQ-Magie zu "verstehen", besteht darin, einige Haltepunkte in DbQueryProvider-Methoden zu platzieren.

Verwandte Themen