2 Stimmen

Linq to Sql: Mache ich das richtig?

Ich arbeite an einem Projekt für eine Datenbankzugriffsschicht und habe beschlossen, Linq to SQL dafür zu verwenden. Eines der Dinge, die ich tun wollte, war die Bereitstellung einer API, die Linq-Ausdrücke als Argumente zum Abrufen von Daten verwenden kann. Zum Beispiel habe ich jetzt diese API geschrieben, die wie folgt aussieht:

 public Result GetResults(System.Linq.Expressions.Expression<Func<Result, bool>> predicate)
    {
        Result result = db.Results.SingleOrDefault(predicate);
        return result;
    }

Mit dieser API können Sie dann die Datenbank nach einer Ergebniszeile abfragen, die z. B. bestimmte Bedingungen erfüllt:

Result result = Provider.GetResults(r => r.ID == 11);

Das funktioniert sehr gut. Ich bin in der Lage, die eine Zeile zu erhalten, die ich basierend auf meinen Bedingungen möchte.

Der nächste Schritt bestand darin, mehrere Objekte aus der Datenbank zurückzuholen.

Ich habe es folgendermaßen hinbekommen:

public List<Result> GetResults(System.Linq.Expressions.Expression<Func<Result, bool>> predicate)
    {
        List<Result> results = db.Results.Select(r => r).Where(r => r.ID == 11).ToList<Result>();
        return results;
    }

Wie Sie sehen können, rufe ich ein Select mit r => r auf, das mir alles zurückgibt, und dann verwende ich ein Where, um zu filtern, was ich brauche.

Es funktioniert... aber irgendetwas sagt mir, dass ich es wirklich hässlich mache. Ich könnte mich irren, aber zieht das nicht ALLES aus der Ergebnistabelle und filtert es dann? oder stellt es die richtige SQL-Anweisung zusammen, die auf Datenbankebene filtert?

Wie auch immer... Ich würde sehr schätzen einige Anleitung, wie ich diese Aufgabe zu bewältigen. Wie schreibe ich eine API, die einen Linq-Ausdruck als Argument nimmt und gibt eine Reihe von Objekten aus der Datenbank auf der Grundlage dieses Ausdrucks.

Gracias.

1voto

Marc Gravell Punkte 970173

Le site Select(r=>r) tut nichts (außer dem Wechsel von Table<T> まで IQueryable<T> - aber nichts nützlich ). Und ich nehme an, dass Sie die Absicht hatten, die predicate zum Where ?

Dies ist in der Tat nicht alles herausnehmen und filtern - die entsprechenden WHERE (TSQL)-Klausel generiert wird. Dies ist aufgrund der "aufgeschobenen Ausführung" und der "Zusammensetzbarkeit" möglich, d. h., es wird erst dann etwas ausgeführt, wenn Sie mit der Iteration der Daten beginnen (in der ToList() ) - bis dahin gestalten Sie lediglich die Abfrage.

Sie können dies sehen, indem Sie etwas tun wie:

db.Log = Console.Out;

und schauen Sie sich die TSQL an. Oder führen Sie einen TSQL-Trace aus. Um es hübscher zu machen, vereinfachen Sie es zu:

return db.Results.Where(predicate).ToList();

0voto

bytebender Punkte 7216

Ich weiß, Sie sagten, Sie wollten ein Prädikat übergeben und eine Liste zurückgeben, aber haben Sie erwägt, eine IQueryable zurückgeben

Dann könnten Sie anrufen:

 GetResults().Where(r => r.SomeProperty == "SomeValue")
     .OrderBy(r => r.SomeOtherProperty)
     .Skip(10) 
     .Take(10); //etc. 

Mit Ihrem aktuellen API-Design würden Sie alle Datensätze zurückgeben und müssten dann 10 abrufen, wohingegen die obige Variante nur die 10 zurückgeben würde, die Sie benötigen...

Nur ein paar Gedanken...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X