如何使用Lambda将LINQ理解查询语法转换为方法语法

Mik*_*Dev 13 .net linq lambda linq-query-syntax

是否有工具,流程或解决方案将以下LINQ查询语法转换为使用Lambdas的方法语法(点表示法)?我希望解决方案将以下查询语法转换为方法语法,例如this.

var filteredEmployees = 
    from employee in allEmployees
    where employee.DepartmentID < 4 && employee.EmployeeID < 10
    orderby employee.DepartmentID descending,
            employee.LastName descending
    select employee;
Run Code Online (Sandbox Code Playgroud)

以下

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

我想用它来更好地学习方法语法.

Rui*_*mba 21

LINQPad是您需要的好工具.我从他们的网站"窃取"了以下截图,以更好地说明它是如何工作的.如果使用linq语法编写查询,可以单击红色突出显示的按钮以查看等效的lambda语法:在此输入图像描述


Mik*_*Dev 10

如果我们强制查询语法返回一个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());
Run Code Online (Sandbox Code Playgroud)

在前面的代码中,我们将"AsQueryable()"添加到"allEmployees"列表类型.返回类型现在将是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)
Run Code Online (Sandbox Code Playgroud)

它并不完美,但我们可以轻松地将其编辑为以下内容

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

Console.WriteLine(filteredEmployees);
Run Code Online (Sandbox Code Playgroud)

在前面的代码中,我删除了"System.Collections.Generic.List`1 [UserQuery + Employee]"并将其替换为"allEmployees".我还用"&&"替换"AndAlso".

这将返回与查询语法中的查询相同的结果.