是否有工具,流程或解决方案将以下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;
以下
var filteredEmployees2 = allEmployees.Where(employee => ((employee.DepartmentID < 4) && (employee.EmployeeID < 10)))
.OrderByDescending(employee => employee.DepartmentID)
.ThenByDescending(employee => employee.LastName);
我想用它来更好地学习方法语法。
答案 0 :(得分:18)
LINQPad是您需要的好工具。我从他们的网站“窃取”了以下截图,以更好地说明它是如何工作的。如果使用linq语法编写查询,可以单击红色突出显示的按钮以查看等效的lambda语法:
答案 1 :(得分:9)
如果我们强制查询语法返回一个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());
在前面的代码中,我们将“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)
这并不完美,但我们可以轻松地将其编辑为以下内容
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”替换为“&amp;&amp;”。
这将返回与查询语法中的查询相同的结果。
答案 2 :(得分:2)
通过声明生成某个对象的lambda表达式,可以获得更直接的表达式。实际表达式将是您要使用查询语法查看的查询。然后通过检查编译器生成的表达式树,您可以看到在不必更改原始查询的情况下调用了哪些方法。
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<>
时,不会生成相同的查询,只会略微修改。您必须忽略AsQueryale()
电话。还有可能查询提供程序可以重写表达式,因此使用ToString()
返回的内容可能没有1:1的对应关系。编译器生成的表达式将完全符合您的预期。