Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何使用Lambda将LINQ理解查询语法转换为方法语法_.net_Linq_Lambda_Linq Query Syntax - Fatal编程技术网

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

.net 如何使用Lambda将LINQ理解查询语法转换为方法语法,.net,linq,lambda,linq-query-syntax,.net,Linq,Lambda,Linq Query Syntax,是否有工具、流程或解决方案可以将以下LINQ查询语法转换为使用Lambdas(点表示法)的方法语法?我希望该解决方案能够将以下查询语法转换为这样的方法语法 var filteredEmployees = from employee in allEmployees where employee.DepartmentID < 4 && employee.EmployeeID < 10 orderby employee.DepartmentID d

是否有工具、流程或解决方案可以将以下LINQ查询语法转换为使用Lambdas(点表示法)的方法语法?我希望该解决方案能够将以下查询语法转换为这样的方法语法

var filteredEmployees = 
    from employee in allEmployees
    where employee.DepartmentID < 4 && employee.EmployeeID < 10
    orderby employee.DepartmentID descending,
            employee.LastName descending
    select employee;
var filteredEmployees=
来自所有员工中的员工
其中employee.DepartmentID<4&&employee.EmployeeID<10
orderby employee.DepartmentID降序,
employee.LastName降序
选择员工;
以下

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

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

如果我们强制查询语法返回一种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());
IQueryable筛选器员工=
(来自allEmployees.AsQueryable()中的雇员)
其中employee.DepartmentID<4&&employee.EmployeeID<10
orderby employee.DepartmentID降序,
employee.LastName降序
选择员工);
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)
System.Collections.Generic.List`1[UserQuery+Employee]
.其中(employee=>((employee.DepartmentID<4)和(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);
IEnumerable filteredEmployees2=allEmployees
其中(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”替换为“&&&”


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

您可以通过声明生成某些对象的lambda表达式来获得更直接的表达式。实际表达式将是您希望使用查询语法查看的查询。然后,通过检查编译器生成的表达式树,您可以看到什么方法c所有查询都是在不改变原始查询的情况下进行的

表达式fn=()=>
来自所有员工中的员工
其中employee.DepartmentID<4&&employee.EmployeeID<10
orderby employee.DepartmentID降序,
employee.LastName降序
选择员工;
//检查fn.阀体

在那里使用
IQueryable
不会生成相同的查询,但会稍微修改。
AsQueryable()
调用必须忽略。查询提供程序也可能会重写表达式,以便使用
ToString()返回
可能没有1:1的对应关系。编译器生成的表达式将完全符合您的预期。

是满足您需要的一个好工具。我“偷了”下面是他们网站上的截图,以更好地说明其工作原理。如果您使用linq语法编写查询,您可以单击以红色突出显示的按钮以查看等效的lambda语法:

这将创建一个表达式树
filteredEmployees.expression
我有LINQpad premium,它是查看lambda表达式的绝佳工具。我使用了很多东西,比如原型应用程序和测试代码。谢谢你的webshot;这确实有助于理解这一点。