2017-10-16 6 views
-1

私はこれらの2つの質問の違いを説明しようとするのをやめ、この質問を削除しようとしましたが、システムは私に許されません。すみません、皆さんの時間を無駄にしました。エンティティプロパティを拡張メソッドなしの変数に名前で格納する方法はありますか?

しかし、間違いなく、別々にそれぞれの質問にはアドレスこれら二つの違いがあります:

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

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

私は文字列名を変換する関数を作成しようとしています拡張メソッドを使用せずにエンティティプロパティを参照するラムダ式に変換します。私たちが使用するリポジトリはLambdaを受け入れますので、拡張メソッドを送ることはできません。

// 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変換をしていないとどうなりますか?変換が必要な理由が表示されません –

+0

@AaronRoberts変換せずに、Entity Frameworkはintをオブジェクトに変換する作業を受け取りますが、これは理解できません。 –

+0

@Backsこの質問を別のものと区別するために、トップ編集を追加しました。基本的にはクエリを拡張するのではなく、orderbyパラメータを変数に格納します(そのため、そのパラメータをリポジトリに渡すことができます)。 –

答えて

-1

どのようにこのような何か?

あなたは .OrderBy(lookup["S"])または .OrderBy(lookup["D"])

あなたが持っていたものに似ていますが、保存することができるもの(キー)とそれを関連付けることができます

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; 
      } 

+0

本質的に大文字のcase文を作成することはできません。文字列に格納されているエンティティのプロパティ名を、厳密に型指定されたEntity.Propertyに変換します(コードが実行する)。エンティティについて知る必要はなく、文字列とプロパティのスペルを一致させるだけです。しかし、QueryableをEnumerableに変換し、orderbyをSQLに送信しません。これは動作しません。答えは、何とか翻訳コードを修正することです。 –

+0

うん、十分な公正。私はこれが 'order by 'をデータベースに送信しないことに同意します。あなたが時折古い学校に行かなければならないことが良いレッスンです。私はビューがここではオプションの悪いセットの最高かもしれないと思う。理解するのがずっと簡単です。 – LoztInSpace

関連する問題