2017-10-06 2 views
0

Ich erstelle dynamische Lambda-Ausdrücke aus String-Ausdrücken mit ParseAsExpression. Das Problem ist, dass ich nicht herausfinden kann, wie ein Ausdruck eines Arrays zu analysieren enthält ein Objekt wie mylist.Contains(x.Id)Analysiere als Ausdruck ein Array, das einen spezifischen Bezeichner enthält

Voll Beispiel

var list = new int[] { 4,5,6}; 
var whereFunction = new Interpreter().SetVariable("mylist", list);  
whereFunction.ParseAsExpression<Func<Person, bool>>("(person.Age == 5 && person.Name.StartsWith(\"G\")) || person.Age == 3 && mylist.Contains(person.Id)", "person"); 
+0

Welche Sprache ist das? – melpomene

Antwort

2

Denn jetzt können Sie eine Abhilfe tun, indem Sie einen Alias-Extension-Methode für jede Methode der Umsetzung nicht funktioniert, wie für Contains =>Exists:

var list = new int[] { 4,5,6}; 

var whereFunction = new Interpreter() 
.SetVariable("mylist", list) 
.Reference(typeof(ExtensionMethods)); 

whereFunction.ParseAsExpression<Func<Person, bool>>("(person.Age == 5 && person.Name.StartsWith(\"G\")) || person.Age == 3 && mylist.Exists(person.Id)", "person"); 

// Define this class somewhere 
public static class ExtensionMethods 
{ 
    public static bool Exists<T>(this IEnumerable arr, T searchKey) 
    { 
     return ((IEnumerable<T>)arr).Contains(searchKey); 
    } 
} 

Ich sehe dies als eine dumme Abhilfe ist, aber es werde arbeiten.

+0

Wenn diese Lösung für Sie funktioniert, überprüfen Sie sie bitte als richtige Antwort. – Dabbas

+0

Ok, ich überprüfe es, aber um wahr zu sein, hat es nicht für mein Szenario funktioniert. Obwohl er den Ausdruck erstellt, kann er nicht als sql-Ausdruck in Servicestack Ormlite oder Entitätsframework verwendet werden. Warten auf die fix .... –

+0

Es wird nicht sicher für SQL arbeiten zu können, nicht erwähnt, dass Sie es für SQL wollte. Diese Lösung funktioniert nur für linq to object. – Dabbas

Verwandte Themen