2013-03-03 139 views
8

是否有工具,进程或解决方案将下列LINQ查询语法转换为使用Lambdas(点符号)的方法语法?我期望该解决方案将下面的查询语法转换为一个像这样的方法语法。如何使用Lambda将LINQ Comprehension查询语法转换为方法语法

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

我想利用这个学习方法语法更好。

回答

15

LINQPad是您所需要的很好的工具。我从他们的网站上“偷走”了下面的截图,以更好地说明它是如何工作的。如果您使用LINQ语法编写一个查询,您可以点击按钮以红色突出显示,以看相当于lambda语法:enter image description here

+1

我有LINQpad溢价和一个伟大的工具查看Lambda表达式。我使用了大量的东西,比如原型应用程序和testig代码。感谢网页截图;它真的有助于解决问题。 – 2013-03-04 18:48:54

7

如果我们强制查询语法返回一个IQueryable类型,那么我们可以进入方法语法。

在这里,我改变了查询返回的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以前的代码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 +雇员]”,并以“allEmployees”取而代之。我也用“& &”代替“AndAlso”。

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

+0

这将创建一个表达式树'filteredEmployees.Expression' – 2013-03-03 04:10:37

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的对应关系。编译器生成的表达式就是你所期望的。

相关问题