Ich habe eine Zeichenfolge in meiner Datenbank gespeichert:
"Users.ElementAt(1).LastName"
Ich habe dann ein Objekt wie folgt:
MyClass myclass = new MyClass ()
{
Users = new List<User>()
{
new User()
{
LastName = "LastName1"
},
new User()
{
LastName = "LastName2"
},
}
};
Gibt es eine Möglichkeit, die angegebene Zeichenfolge für mein Objekt zu analysieren, auszuwerten oder auszuführen, um den Nachnamen jedes Benutzers zu erhalten?
Ich habe die DynamicLinq-Bibliothek verwendet, stoße jedoch auf ein Problem mit ElementAt (1) mit der Fehlermeldung:
"Es gibt keine anwendbare Aggregatmethode 'ElementAt'"
Kann hier jemand eine Anleitung geben? Muss ich meinen eigenen Parser schreiben und Reflexion verwenden?
Es sieht so aus, als ob der Ausdrucksparser von DynamicLinq nur eine Teilmenge der Standardmethoden für LINQ-Operatoren unterstützt:
interface IEnumerableSignatures
{
void Where(bool predicate);
void Any();
void Any(bool predicate);
void All(bool predicate);
void Count();
void Count(bool predicate);
void Min(object selector);
void Max(object selector);
void Sum(int selector);
void Sum(int? selector);
void Sum(long selector);
void Sum(long? selector);
void Sum(float selector);
void Sum(float? selector);
void Sum(double selector);
void Sum(double? selector);
void Sum(decimal selector);
void Sum(decimal? selector);
void Average(int selector);
void Average(int? selector);
void Average(long selector);
void Average(long? selector);
void Average(float selector);
void Average(float? selector);
void Average(double selector);
void Average(double? selector);
void Average(decimal selector);
void Average(decimal? selector);
void Take(int count);
void Union(IQueryable right);
void OrderBy(LambdaExpression exp);
void OrderByDescending(LambdaExpression exp);
}
Wie Sie sehen können, gehört ElementAt
nicht dazu. Die gute Nachricht ist, dass Sie einfach void ElementAt(int index);
hinzufügen void ElementAt(int index);
to IEnumerableSignatures
scheint gut zu funktionieren. ElementAt
, dass der von Ihnen verwendete LINQ-Abfrageanbieter den ElementAt
Operator verarbeitet. es ist durchaus möglich, dass dies nicht der Fall ist.
Wenn das Ändern der DynamicLinq-Quelle jedoch keine Option ist, gibt es im Kern von .NET Framework oder LINQ keine Funktionen, mit denen diese Arten von Ausdrücken analysiert und ausgewertet werden können. Es gibt andere Optionen (siehe ScriptCS, Roslyn), aber ich vermute, Sie tendieren zu einer "Overkill" -Lösung für das eigentliche Problem, das Sie lösen möchten.
var allLastNamesInList= Users.Select(x=> x.LastName).toList();
Diese Anweisung durchläuft die Liste und erhält alle Nachnamen. Sie können auch order by verwenden, damit Sie die Nachnamen in der richtigen Reihenfolge erhalten.
Ist dies die Anforderung, die Sie suchen, oder etwas anderes?