2016-03-27 18 views
0

Betrachten Lambda-Ausdruck folgende:C# Lambda-Ausdruck - Get Eigenschaftswert von String

IQueryable<Product> query = query.Where(x => x.ProductName.Contains("P100")); 

ich über Code, so etwas konvertieren müssen:

IQueryable<Product> query = query.Where(x => x.GetPropertyValue("ProductName").Contains("P100")); 

Hier habe ich eine Dummy-Methode hinzugefügt haben GetPropertyValue("ProductName") zu erkläre die Anforderung. Im obigen Code sollte die Eigenschaft in der Laufzeit aufgelöst werden. Mit anderen Worten, ich muss auf die Eigenschaft von einem Stachel-Wert zugreifen. Eg "ProductName"

Wie kann ich das tun?

+0

Ich meine, ich muss diese Methode generischer machen. Gemäß meiner Anwendungslogik habe ich nur den Eigenschaftsnamen als String-Wert. Also muss ich die Zeichenfolge als eine Eigenschaft auflösen. – Rahul

+0

Was ist Ihr Abfrageprozessor? Wird es sogar eine 'GetPropertyValue() 'Methode für ein' Product' Objekt unterstützen? Es macht keinen Sinn, die Konvertierung durchzuführen, wenn sie nicht unterstützt wird. –

+1

Sie müssen entweder Linq Expressions lernen oder Dynamic Linq verwenden. – Aron

Antwort

4
var parameterExp = Expression.Parameter(typeof(Product), "type"); 
var propertyExp = Expression.Property(parameterExp, propertyName); 
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) }); 
var someValue = Expression.Constant(propertyValue, typeof(string)); 
var containsMethodExp = Expression.Call(propertyExp, method, someValue); 

Expression<Func<Product, bool>> predicate = Expression.Lambda<Func<T, bool>> 
      (containsMethodExp, parameterExp); 


var query = query.Where(predicate); 
+0

Kann das einfach auf einen linq 'where'-Aufruf ohne das contains-Bit übertragen werden? –

+0

@DouglasGaskell Was meinst du ohne das enthält Bit? Der obige Code dient zum Generieren eines reinen Linq-Ausdrucksbaums ohne CLR. Dadurch kann diese Abfrage in den meisten Linq-Providern ausgeführt werden, einschließlich nicht von CLR unterstützten Anbietern wie EF oder nHiberate. – Aron

0

Sie können diese Erweiterung Methode haben:

Dann:

IQueryable<Product> query = query.Where(x => x.GetPropertyValue<string>("ProductName").Contains("P100")); 

Beachten Sie, dass dies nicht mit Entity Framework arbeiten, um eine Datenbank abzufragen, aber da Sie nicht die Frage mit Entity-Framework getaggt, ich nehme nicht an, dass Sie es verwenden

+0

Ich verwende Odata V4 mit Odata Client Code Generator. Ob das funktioniert? – Rahul

+0

Ich habe es nie benutzt, ich weiß es nicht, aber wenn es für die Frage relevant ist (und es ist), sollten Sie es spezifiziert haben (oder zumindest die Frage getaggt haben) – Jcl