Ich möchte eine Reihe von Filtern für einen Benutzer zur Verfügung stellen, und jeder Filter entspricht einer Expression<Func<X, bool>>
. Daher möchte ich vielleicht eine dynamische Liste verfügbarer Elemente ("Joe", "Steve", "Pete" usw.) erstellen und eine Sammlung von "fest codierten" Filtern basierend auf diesen Namen erstellen und den Benutzer auswählen lassen welchen Filter er benutzen möchte. Mein Problem ist, dass, selbst wenn ich versuche, meinen Ausdruck basierend auf einem String-Wert aus der dynamischen Liste zu "codieren", der Ausdruck den Wert immer noch als eine Eigenschaft speichert, die an einem anonymen Typ hängt (und Ich weiß nicht, wie man den Anon serialisiert. Tut mir leid, wenn das verwirrend ist, ich bin nicht ganz sicher, wie ich das artikulieren soll.LINQ: Wie erzwinge eine wertorientierte Referenz?
Hier ist mein Beispielcode:
public class Foo
{
public string Name { get; set; }
}
static void Main(string[] args)
{
Foo[] source = new Foo[]
{
new Foo() { Name = "Steven" } ,
new Foo() { Name = "John" } ,
new Foo() { Name = "Pete" },
};
List<Expression<Func<Foo, bool>>> filterLst = new List<Expression<Func<Foo, bool>>>();
foreach (Foo f in source)
{
Expression<Func<Foo, bool>> exp = x => x.Name == f.Name;
filterLst.Add(exp);
}
}
}
Mein Problem ist, dass, wenn ich sehe, wenn ich am Körper meines Ausdruck aussehen, es lautet wie folgt:
(x.Name = value(ConsoleApplication1.Program+<>c__DisplayClass3).value)
Wenn das, was ich wirklich wollen, ist für die erste wie folgt zu lesen:
(x.Name = "Steven")
(wenn ich meinen Code dies zu ändern, statt, das ist genau ly, was ich bekommen:
Expression<Func<Foo, bool>> exp = x => x.Name == "Steven";
)
Ich habe versucht, meinen Wert auf einen lokalen String-Wert zu zwingen, bevor sie in die Expression kleben, aber es scheint nicht zu helfen:
List<Expression<Func<Foo, bool>>> filterLst = new List<Expression<Func<Foo, bool>>>();
foreach (Foo f in source)
{
string value = f.Name;
Expression<Func<Foo, bool>> exp = x => x.Name == value;
filterLst.Add(exp);
}
Ich verstehe nicht warum (oder wirklich, wie), es sieht immer noch an einem anonymen Typ, auch wenn ich eine lokale Variable verwende, die zu einem String deklariert wird. Gibt es eine Möglichkeit, dies so zu machen, wie ich es möchte?
(aktualisierte Antwort zum Anzeigen des Ausdrucksbaumaufbaus) –
Sie vereinfachen ein komplexeres Szenario für uns? Es gibt einfachere Möglichkeiten, nach einem Array von Objekteigenschaften zu filtern. –
@Jonas: Ja, ich habe mein aktuelles Szenario ziemlich vereinfacht. Ich möchte nicht wirklich die Eigenschaft Name gegen eine konstante Zeichenfolge filtern. Ich beschäftige mich mit komplexeren Objekten und biete dem Benutzer mehrere Sammlungen von "Filtern" an, die auf verschiedenen Eigenschaften oder mehreren Eigenschaftsbedingungen basieren können. Letztendlich werden jedoch alle diese "Filter" zum selben Objekttyp abstrahiert (Ausdruck), den ich zu einer IQueryable-Quellenliste hinzufüge, um schließlich eine Abfrage zu erzeugen. –
Steven