C #, Linq2SQL: Erstellen eines Prädikats, um Elemente innerhalb einer Reihe von Bereichen zu finden

8

Sagen wir, ich habe etwas namens Stuff in meiner Datenbank mit einer Eigenschaft namens Id. Vom Benutzer erhalte ich eine Sequenz ausgewählter Range-Objekte (oder besser gesagt, ich erstelle sie aus ihrer Eingabe) mit den gewünschten Ids. Eine abgespeckte Version dieser Struktur sieht folgendermaßen aus:

%Vor%

So könnte man beispielsweise bekommen haben:

%Vor%

Ich möchte das dann verwenden, um ein Prädikat zu erstellen, um nur Dinge auszuwählen, die einen Wert zwischen diesen haben. Wenn ich zum Beispiel den PredicateBuilder verwende, kann ich das beispielsweise so machen:

%Vor%

und dann:

%Vor%

Was funktioniert! Was ich jetzt tun möchte, ist eine generische Erweiterungsmethode zu erstellen, um diese Prädikate für mich zu erstellen. So ähnlich:

%Vor%

Problem hier ist, dass es mit einer NotSupportedException wegen des Selektor (ø) Aufrufs abstürzt: Method 'System.Object DynamicInvoke(System.Object[])' has no supported translation to SQL.

Ich denke, das ist verständlich. Aber gibt es einen Weg, dies zu umgehen? Was ich gerne beenden würde, ist, dass ich einfach tun könnte:

%Vor%

Oder noch besser, erstelle etwas, das ein IQueryable zurückgibt, damit ich es einfach tun kann:

%Vor%

Also, irgendwelche Ideen? Ich würde wirklich gerne arbeiten, denn wenn nicht, werde ich eine Menge dieser foreach Blöcke von Code, erstellen Prädikate ...

Anmerkung 1: Natürlich wäre es schön, wenn ich zu mehr als int expandieren könnte, wie DateTime und so, aber nicht sicher, wie das mit dem & gt; = und & lt; = operators ... Funktioniert CompareTo mit linq-to-sql? Wenn nicht, gibt es kein Problem, zwei zu erstellen. Eins für int und eins für DateTime, da das meistens die Typen sind, für die dies verwendet wird.

Hinweis 2: Es wird für Berichte verwendet, bei denen der Benutzer basierend auf verschiedenen Dingen eingrenzen kann, was herauskommt. Wie, ich möchte diesen Bericht für diese Leute und diese Daten.

    
Svish 16.02.2009, 14:19
quelle

2 Antworten

7

Die Verwendung mit Generika ist problematisch, da C # keine Operatoren für Generika unterstützt. Das bedeutet, dass Sie den Ausdruck manuell schreiben müssen. Und wie wir bereits gesehen haben, funktioniert String anders. Aber für den Rest, wie wäre es mit etwas wie (ungeprüft):

( bearbeitet für mehrere Bereiche)

%Vor%

Hinweis; die Verwendung von Expression.Invoke bedeutet, dass es wahrscheinlich mit LINQ-to-SQL funktioniert, aber nicht mit EF (momentan; hoffentlich behoben in 4.0).

Mit Verwendung (getestet auf Northwind):

%Vor%

Erzeugen von TSQL (neu formatiert):

%Vor%

Genau das, was wir wollten ;-p

    
Marc Gravell 16.02.2009, 14:27
quelle
0

Sie erhalten diesen Fehler, weil alles für LINQ to SQL in Form eines Ausdrucks vorliegen muss . Probieren Sie dies

aus %Vor%

Beachten Sie, dass ich den Selektor vor der Verwendung kompiliere. Dies sollte ohne Probleme funktionieren, ich habe in der Vergangenheit so etwas verwendet.

    
Nick Berardi 16.02.2009 14:29
quelle