2017-11-28 3 views
-1

モデル名がUserであり、カップルのプロパティがNameAgeの場合を考えてみましょう。私はUserを受け入れ、ラムダ関数がOrderByメソッドで使用できるようにこれらのプロパティの1つを返すラムダ関数の型を知りたいと思います。パラメータとしてOrderByラムダ関数を渡す

using System; 
using System.Linq; 

public class User { 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

public class MainClass { 
    static void Main() { 

     var users = new User[] { 
      new User { Name = "David", Age = 16 }, 
      new User { Name = "Charlie", Age = 29 }, 
      new User { Name = "Alice", Age = 15 }, 
      new User { Name = "Deanna", Age = 27 }, 
     }.AsQueryable(); 

     Write(GetAdultsBy(users, u => u.Name)); 
     Write(GetAdultsBy(users, u => u.Age)); 
    } 

    private static IQueryable<User> GetAdultsBy(IQueryable<User> users, Func<User, object> order) { 
     return users 
      .Where(u => u.Age > 18) 
      .OrderBy(order); // FAIL in ORDER BY 
    } 

    private static void Write(IQueryable<User> query) { 
     var names = query.Select(u => u.Name); 
     Console.WriteLine(string.Join(", ", names)); 
    } 
} 

this codeを実行しているとき、私は次のエラーを取得する:

/tmp/997240133/main.cs(26,14):エラーCS0266:暗黙的にタイプSystem.Linq.IOrderedEnumerable<User>' to System.Linq.IQueryable」を変換できませんが。明示的な変換が存在します(キャストがありませんか?)

明示的に並べ替えは、おそらくWrite(users.OrderBy(u => u.Age));でうまく動作します。

Func<User, object> orderパラメータのタイプは何ですか?

+1

あなたはそれが 'のFunc 'ではないと知っているので、あなたは、それが受け入れ何のパラメータを確認するために、 'Queryable.OrderBy'(ドキュメントのか、単にインテリセンスを使用してのいずれか)の署名を見ることができます。 – Servy

答えて

2

OrderBy <>がどのように定義されているかに合わせて、private static IQueryable<User> GetAdultsBy()を汎用関数として定義する必要があります。具体的に:

private static IOrderedQueryable<User> GetAdultsBy<T>(
    IQueryable<User> source, 
    Expression<Func<User, T>> order) 
+0

例を挙げることはできますか?わかりません。 https://glot.io/snippets/evx90fbrz2 – styfle

+0

編集された回答。そして実際には、SLaksの答えに応じてセレクタの型が '式< >'になる必要があるため、あなたが得た例外がありました。 –

+0

私は 'this'はそこにはいけないと思う。それを取り除いても、私は 'u.Age'に次のようなエラーが出ます:' CS1061 'User'に 'Age'の定義がなく、 'Age'というタイプの最初の引数を受け入れる拡張メソッドがない見つけてください ' – styfle

1

IQueryableを使用するには、式ツリー(Expression<Func<...>>)を渡す必要があります。

ランタイム時にラムダの内容をエンコードし、SQLに変換できるようにします。

+0

例を挙げることができますか?わかりません。 https://glot.io/snippets/evx90fbrz2 – styfle

+0

これは正しい軌道だと思いますが、この場合の「...」は何ですか? – styfle

+0

@styfle: 'Func <...>'(引数と戻り値の型)の型パラメータです。 'OrderBy()'の署名を見てください。 – SLaks

関連する問題