Fragensteller
Eine Expression ausführen

Allgemeine Diskussion
-
Hallo Forum,
ich versuche mich derzeit daran einen eigenen LINQ Provider zu erstellen. Vieles klappt ganz gut, manches ist zum verzweifeln.
var pro5 = new ProcessContext().Count(p => p.Name.ToLower().Contains(".dll") == true);
Ich bin nun dabei meinen Source zu verbessern und will nun den übergebenen Lamda-Ausdruck selbst ausführen.
Innerhalb einer Methode habe ich den Parameter "UnaryExpression" der unter anderem mir ein "Operand" mit meinem Lamda Ausdruck zurückgibt. Diesen will innerhalb einer ForEach-Schleife in einem "If<Lamda-Ausdruck>. == true" auswerten.
Wie kommen ich an den Lamda-Ausdruck und wie bekomme ich diesen als Condition in eine If-Anweisung??
- Bearbeitet Gerhard Ahrens Dienstag, 10. Januar 2017 13:41
- Typ geändert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 3. Februar 2017 13:16 Keine bestätigte Lösung
Alle Antworten
-
Hallo Gerhard,
Wenn Deine Anbieter-Klasse die IQueryProvider-Schnittstelle implementiert, kann in einer Execute-Methode die Execute-Methode der Kontext-Klasse aufgerufen werden:
public class YourQueryProvider : IQueryProvider { //... public object Execute(Expression expression) { return QueryContext.Execute(expression, false); } } class QueryContext { internal static object Execute(Expression expression, bool IsEnumerable) { //... } }
Ein ausführlicheres Beispiel findest Du in diesem Artikel. Wenn Du etwas Anderes im Sinn hattest, gehe bitte näher darauf ein.
Gruß,
Dimitar
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
- Bearbeitet Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 13. Januar 2017 12:31 Tippfehler behoben
-
Hallo Ditmar,
hier will ich nun irgendwie meine Lamda Expression in meine If-Anweisung bekommen. Das Interface "IQueryProvider" ist bereits implementiert. Ich hatte noch ein paar Zeilen aus dem Microsoft Beispiel übernommen, aber ich merke das ist ein komplexes Thema.
private void ProcessQuoteResult(UnaryExpression expression) { InnermostWhereFinder whereFinder = new InnermostWhereFinder(); MethodCallExpression whereExpression = whereFinder.GetInnermostWhere(expression); LambdaExpression lambdaExpression = (LambdaExpression)((UnaryExpression)(whereExpression.Arguments[1])).Operand; IList<Win32_Process> filtered = new List<Win32_Process>(); foreach (Win32_Process proc in GetProcesses()) { if (< ... >) { filtered.Add(proc); } } processes = filtered; }
Danke und Gruß
Gerhard