2008-09-22 33 views
14

Was ist der beste Weg, LINQ-Abfragen und Lambda-Ausdrücke dynamisch zu schreiben?Dynamische LINQ- und dynamische Lambda-Ausdrücke?

Ich denke an Anwendungen, in denen der Endbenutzer Geschäftslogikregeln entwerfen kann, die dann ausgeführt werden müssen.

Es tut mir leid, wenn dies eine neue Frage ist, aber es wäre toll, aus Erfahrung Best Practices zu erhalten.

Antwort

1

Ich kann zwei Möglichkeiten sehen, wie Sie Lambda dynamisch generieren können. Sie könnten Reflection.Emit versuchen, IL (den .Net-Bytecode) direkt zu generieren und sie als Lambda zu bezeichnen, oder Sie können den System.CodeDom und Microsoft.CSharp.CSharpCodeProvider verwenden, um den Code von Konstrukten höherer Ebene zu generieren. Was Sie tun möchten, hängt davon ab, wie der Benutzer dieses Zeug eingeben soll. Wenn Sie möchten, dass der Benutzer C# schreibt, können Sie einfach den eingebauten Compiler verwenden.

Linq dynamisch generieren sollte einfacher sein. Sie sollten in der Lage sein, LINQ-Abfragen als Ausdrucksbäume in Runtime zu generieren und sie dann zur Ausführung in ein IQueryable zu übergeben. Ich schlage vor, dass Sie sich die Dokumentation zu IQueryable ansehen, um mehr darüber zu erfahren. Ein anderer Weg wäre, ein paar Linq-Abfragen vorzudefinieren und es dem Benutzer dann zu erlauben, sie zu verketten. Dies sollte praktikabel sein, da jede Linq-Abfrage ein IEnumerable zurückgibt, das von der nächsten Linq-Abfrage konsumiert werden kann.

2

Eine weitere Möglichkeit besteht darin, eine Skriptlaufzeit in Ihr Programm zu integrieren, damit Ihre Benutzer die Geschäftslogik in eine DSL schreiben können. IronPython wäre ein Kandidat.

+0

Klare Ratschläge. Wir haben das für die Konfiguration von Workflows getan und es funktioniert ganz gut. –

+0

der einzige Nachteil ist, dass Sie Probleme mit voller/teilweise vertrauen können, die Ihren Code daran hindern würde in asp.net – viggity

+0

das ist eine Möglichkeit, aber es ist keine Antwort auf meine Frage ... – Sklivvz

-1

Ich verstehe nicht, was meinst du "besten Weg" zu sagen. Es wäre besser, ein einfaches Beispiel dafür zu geben, was Sie erreichen wollen. Das Erstellen eines dynamischen LINQ-Ausdrucks ist nicht schwierig, aber kompliziert. Hier

ist ein Beispiel für dynamische Linq Ausdruck Schöpfung:

How do I compose existing Linq Expressions

+0

Aku, wenn es schwierig ist Dann gibt es sicherlich Best Practices? – Sklivvz

+1

Ich kenne keine "Best Practices" für solche Dinge. Ich weiß, wie man ein konkretes Problem löst, aber der allgemeine "beste Weg" ist zu vage. – aku

0

Lambda-Ausdrücke können einfach über das System.Linq.Expressions Namespace erstellt werden.

0

System.Linq.Expressions ist, was Sie brauchen. Ich habe eine nette Benutzeroberfläche geschrieben, mit der Benutzer Abfragen dynamisch in Form einer Ausdrucksstruktur definieren und erstellen können. Sie können diese dann an Linq2SQL oder einen Client Ihrer Wahl weiterleiten.