2017-10-16 3 views
-1

Ich habe es aufgegeben zu versuchen, den Unterschied zwischen diesen beiden Fragen zu erklären und habe versucht, diese Frage zu löschen, aber das System lässt mich nicht. Es tut mir leid, dass ich alle Zeit verschwendet habe.Wie wird eine Entity-Eigenschaft nach Name in einer Variablen ohne eine Erweiterungsmethode gespeichert?

Aber es ist definitiv ein Unterschied zwischen diesen beiden Dingen, die jede Frage einzeln adressiert:

Entity.OrderBy("field name") //<-- Extension method 

und

Expression<Func<TE,TK>> myvar; 
Entity.OrderBy(myvar)  //<-- Variable holding an Expression 

Ich versuche, eine Funktion zu erstellen einen String-Namen zu konvertieren in einen Lambda-Ausdruck, der auf eine Entity-Eigenschaft verweist, ohne eine Erweiterungsmethode zu verwenden. Das von uns verwendete Repository akzeptiert Lambdas, daher können wir keine Extension-Methoden senden.

// LinqPad for testing 
void Main() 
{ 
    string prop = "sku"; 

    // We can store data type of property in variable, but how 
    // do we convey that value in the <> brackets? 
    Expression<Func<[Entity type],[Property type]>> orderby; 

    orderby = Me.GetOrder<Product,[How do I get SKU type here?]>("sku"); 

    Product.OrderBy(orderby).Skip(10).Take(10).Dump(); 

} 

public static class Me 
{ 
    public static Expression<Func<TE, TK>> GetOrder<TE,TK>(
     string propertyName) where TE: class 
    { 
     //Create x=>x.PropName 
     var propertyInfo = typeof(TE).GetProperty(propertyName); 
     ParameterExpression arg = Expression.Parameter(typeof(TE), "x"); 
     MemberExpression property = Expression.Property(arg, propertyName); 
     var selector = Expression.Lambda<Func<TE,Object>>(property, 
            new ParameterExpression[] { arg }); 

     return selector; 
    } 
} 
+0

@ Dr.Zim Was bekommen Sie, wenn Sie die Konvertierung nicht haben? Ich sehe nicht, warum die Konvertierung notwendig ist –

+0

@AaronRoberts ohne die Konvertierung, erhält Entity Framework den Job der Umwandlung der Int in ein Objekt, das es nicht versteht. –

+0

@Backs Ich habe die obere Bearbeitung hinzugefügt, um diese Frage von der anderen zu unterscheiden, im Wesentlichen geht es nicht darum, eine Abfrage zu erweitern, sondern den orderby-Parameter in einer Variablen zu speichern (damit ich diesen Parameter an ein Repository übergeben kann). –

Antwort

-1

Wie wäre es mit so etwas?

private static Dictionary<string, Func<Product,IComparable>> lookup= new 
    Dictionary<string, Func<Product,IComparable>>() { { "S", NewMethod}, { "D", NewMethodD}}; 


      private static IComparable NewMethod(Product a) 
      { 
       return a.SKU; 
      } 
      private static IComparable NewMethodD(Product a) 
      { 
       return a.OtherTHing; 
      } 

Sie können dann .OrderBy(lookup["S"]) oder .OrderBy(lookup["D"])

ähnlich, was Sie hatte aber mit etwas verknüpfen Sie speichern kann (der Schlüssel).

+0

Im Wesentlichen eine große Case-Anweisung zu erstellen, wird nicht funktionieren. 'Expression.Lambda > (Konvertierung, neu [] {prm}. Compile();' verwandelt den in einer Zeichenfolge gespeicherten Entitätsnamen meiner Entity in die stark typisierte Entity.Property, in der der Code enthalten ist muss nicht über die Entität wissen, es passt nur die Zeichenfolge an die Eigenschaft Rechtschreibung. Allerdings verwandelt es das Queryable in ein Enumerable und sendet den Befehl nicht an SQL, was nicht funktioniert. Die Antwort ist, den Übersetzungscode irgendwie zu reparieren. –

+0

Ja, fair genug. Ich stimme zu, dass die Bestellung nicht an die Datenbank gesendet wird. Gute Lektion, dass man manchmal einfach in die alte Schule gehen muss. Ich vermute, eine Aussicht könnte hier der beste einer ganzen Reihe von Optionen sein. Es ist einfach einfacher zu verstehen. – LoztInSpace

Verwandte Themen