18

次の LINQ クエリ構文をラムダ (ドット表記) を使用したメソッド構文に変換するツール、プロセス、またはソリューションはありますか? 次のクエリ構文をこのようなメソッド構文に変換するソリューションが期待されます。

var filteredEmployees = 
    from employee in allEmployees
    where employee.DepartmentID < 4 && employee.EmployeeID < 10
    orderby employee.DepartmentID descending,
            employee.LastName descending
    select employee;

以下へ

var filteredEmployees2 = allEmployees.Where(employee => ((employee.DepartmentID < 4) && (employee.EmployeeID < 10)))
        .OrderByDescending(employee => employee.DepartmentID)
        .ThenByDescending(employee => employee.LastName);

メソッド構文をよりよく学ぶためにこれを使用したいと思います。

4

3 に答える 3

24

LINQPadは、必要なものに適したツールです。以下のスクリーンショットを彼らの Web サイトから「盗み」、その仕組みをよりよく説明しました。linq 構文を使用してクエリを作成する場合は、赤で強調表示されたボタンをクリックして、同等のラムダ構文を表示できます。ここに画像の説明を入力

于 2013-03-03T21:47:41.833 に答える
11

クエリ構文が IQueryable の型を返すように強制すると、メソッド構文に到達できます。

ここで、IQueryable の型を返すようにクエリを変更しました。

IQueryable<Employee> filteredEmployees = 
    (from employee in allEmployees.AsQueryable()
    where employee.DepartmentID < 4 && employee.EmployeeID < 10
    orderby employee.DepartmentID descending,
            employee.LastName descending
    select employee);

Console.WriteLine(filteredEmployees.ToString());

前のコードでは、"allEmployees" リスト型に "AsQueryable()" を追加しました。戻り値の型は IQueryable になり、"filteredEmployees" は "IQueryable" 型になります。次に、"filteredEmployees" で行う必要があるのはすべてです。 「ToString()」メソッドを呼び出します。

そして、以下がコンソールに書き込まれます。

System.Collections.Generic.List`1[UserQuery+Employee]
     .Where(employee => ((employee.DepartmentID < 4) AndAlso (employee.EmployeeID < 10)))
     .OrderByDescending(employee => employee.DepartmentID)
     .ThenByDescending(employee => employee.LastName)

完璧ではありませんが、これを次のように簡単に編集できます

IEnumerable<Employee> filteredEmployees2 = allEmployees
        .Where(employee => ((employee.DepartmentID < 4) && (employee.EmployeeID < 10)))
        .OrderByDescending(employee => employee.DepartmentID)
        .ThenByDescending(employee => employee.LastName);

Console.WriteLine(filteredEmployees);

前のコードでは、「System.Collections.Generic.List`1[UserQuery+Employee]」を削除し、「allEmployees」に置き換えました。「AndAlso」も「&&」に置き換えます。

これにより、クエリ構文のクエリと同じ結果が返されます。

于 2013-03-03T02:52:17.450 に答える
3

オブジェクトを生成するラムダ式を宣言することで、より直接的な式を取得できます。実際の式は、クエリ構文を使用して表示するクエリになります。次に、コンパイラによって生成された式ツリーを調べることにより、元のクエリを変更することなく、どのメソッド呼び出しが行われたかを確認できます。

Expression<Func<object>> fn = () =>
    from employee in allEmployees
    where employee.DepartmentID < 4 && employee.EmployeeID < 10
    orderby employee.DepartmentID descending,
            employee.LastName descending
    select employee;
// inspect fn.Body

行ったように使用IQueryable<>すると、同じクエリは生成されませんが、わずかに変更されます。あなたAsQueryable()が無視しなければならない呼び出し。クエリプロバイダーが式を書き直して、使用して戻ってToString()きたものが1:1に対応していない可能性もあります。コンパイラーによって生成された式は、まさにあなたが期待するものになります。

于 2013-03-03T03:47:27.277 に答える