Mehrere Suchparameter mit LINQ

8

Ich schreibe, was ich glaube, sollte eine relativ unkomplizierte Windows Form App sein. Ich verwende LINQ to SQL, obwohl ich es vorher noch nie benutzt habe. Wir haben eine SQL Server-Datenbank und ich erstelle ein Frontend für den Zugriff auf diese Datenbank. Ich versuche, die effizienteste Möglichkeit herauszufinden, nach mehreren (beliebigen) Suchparametern zu suchen.

Im Windows-Formular erstelle ich ein Wörterbuch mit jedem Suchschlüssel und dessen Wert, nach dem gesucht werden soll, und gebe es an meine search () -Methode weiter. Ich versuche, einen Weg zu finden, die Datenbank mit jedem dieser Schlüssel und ihren zugehörigen Werten zu suchen. Hier ist, was ich versuche zu tun:

%Vor%

Ich erkenne, dass syntaktisch x. (temp.Key) falsch ist, aber ich hoffe, dass veranschaulicht, was ich versuche zu tun. Ich habe mich gefragt, ob es eine andere Möglichkeit gibt, was ich tun möchte, ohne eine riesige switch-Anweisung (oder wenn / sonst wenn Baum) zu machen.

BEARBEITEN

Also habe ich es ein wenig überarbeitet, aber ich habe immer noch Probleme damit. Hier ist, was ich derzeit habe:

%Vor%

Laut dem LINQ Dynamic Query Library-Artikel sollte dies in Ordnung sein. Hier ist der Fehler, den ich bekomme:

Die Typargumente für die Methode 'System.Linq.Queryable.Where (System.Linq.IQueryable, System.Linq.Expressions.Expression & gt;)' können nicht aus der Verwendung abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben.

    
jnevelson 28.10.2010, 18:25
quelle

5 Antworten

3

Hier ist ein Beispiel, das funktioniert (ich habe es gerade getestet), mit dem Dynamische LINQ-Abfragebibliothek .

%Vor%

Und um absolut klar zu machen , dass dieser Code tatsächlich funktioniert ist hier die tatsächliche generierte SQL:

%Vor%     
shaunmartin 29.10.2010 06:35
quelle
2

Wenn das Wörterbuch aus irgendeinem Grund nicht benötigt wird, würde ich Ihre Suchmethode wie folgt machen:

%Vor%

Dann würden Sie die Methode wie folgt verwenden:

%Vor%

Gibt es einen Grund, warum Sie das nicht tun können?

[Bearbeiten: hinzugefügt AsQueryable ()]

[Bearbeiten: für dynamische Abfrage mit Zeichenfolgen]

Schauen Sie hier nach und sehen Sie, ob das hilft. Ich habe es nicht benutzt, aber es sieht so aus, als ob es das ist, wonach du suchst: Ссылка

Persönlich würde ich im Allgemeinen den typsicheren Ausdruck & gt; Ansatz, da dies Ihnen Kompilierzeit Fehler geben wird ... aber wenn Strings benötigt werden, dann sieht wie der beste Weg, um es zu tun.

Auf der Grundlage des obigen Links sieht es so aus, als könnten Sie Folgendes tun:

%Vor%

[Bearbeiten: Beispiel für String-Erstellung]

Eines der Probleme ist also, dass Ihre SQL-Abfrage mit einem AND am Ende des Strings enden wird, aber dann keine Bedingung danach ... also, versuchen Sie vielleicht, dies zu ändern ... die Syntax könnte aus sein leicht, aber sollte richtig sein:

%Vor%

Dies wird nur "AND" für Bedingungen nach dem ersten verwenden. Hoffe es hilft ...

FYI - Es ist off-topic, aber 'warum' ich StringBuilder verwendet, ist diese String-Verkettung die Art, wie Sie es hätte die Zeichenfolge zerstört werden und eine neue Zeichenfolge im Speicher 4 Mal pro Schleife erstellt ... so geändert zu einem StringBuilder, da dies einen Puffer erstellt, der gefüllt werden kann und nur bei Bedarf geändert werden kann.

    
Kevin Nelson 28.10.2010 18:40
quelle
0

Anstatt das Wörterbuch zu verwenden, können Sie diese Methode verwenden:

%Vor%

Sie können es wie folgt verwenden:

%Vor%

Sie sind auch nicht auf String-Eigenschaften beschränkt.

    
Athari 28.10.2010 18:49
quelle
0

Versuchen Sie, ein einfaches Zitat für Ihre Zeichenfolge zu setzen? Basierend auf Ihrer foreach-Schleife wird am Ende der Abfrage ein zusätzliches 'UND' eingefügt.

versuche dies stattdessen

%Vor%     
Bonshington 01.11.2010 18:31
quelle
0

Wenn Sie bereit sind, ein Wörterbuch mit durchsuchbaren Begriffen zu erstellen, habe ich etwas verwendet, das dem unten stehenden Ansatz sehr nahe kommt. Ich habe angepasst, was ich tue, passte mehr in wie Sie Dinge taten, ich habe auch die Namen der Tabellen geändert, um ein Datenkontext / Objekt-Modell zu passen, die mir zur Verfügung stehen.

Die Idee besteht darin, eine Schlüsselliste mit Begriffen zu erstellen, nach denen Ihre Abfrage die Suche unterstützt. Fügen Sie dann Funktionen hinzu, die einen Ausdruck zurückgeben, der dann an die where-Klausel Ihrer Abfrage übergeben werden kann.

Sie sollten natürlich eine Fehlerbehandlung für ungültige Schlüssel usw. hinzufügen.

%Vor%     
eoldre 02.11.2010 17:08
quelle

Tags und Links