gpt4 book ai didi

c# - LINQ 表达式如何知道 Where() 在 Select() 之前?

转载 作者:太空狗 更新时间:2023-10-29 17:42:28 26 4
gpt4 key购买 nike

我正在尝试创建 LINQ 提供程序。我正在使用指南 LINQ: Building an IQueryable provider series ,我已将代码添加到 LINQ:构建 IQueryable 提供程序 - 第 IV 部分。

我正在了解它的工作原理及其背后的理念。现在我卡在了一个问题上,这不是代码问题,而是更多关于理解的问题。

我要发出这个声明:

QueryProvider provider = new DbQueryProvider();
Query<Customer> customers = new Query<Customer>(provider);

int i = 3;
var newLinqCustomer = customers.Select(c => new { c.Id, c.Name}).Where(p => p.Id == 2 | p.Id == i).ToList();

代码或表达式以某种方式知道 WhereSelect 之前。但是如何以及在哪里?

代码中没有办法对表达式进行排序,实际上 Debug模式下的 ToString() 显示 Select 在 Where 之前。

我试图让代码失败。正常情况下,我先执行 Where,然后执行 Select

那么表达式如何排序呢?我没有对指南中的代码进行任何更改。

最佳答案

表达式按照您编写它们的顺序“解释”、“翻译”或“执行” - 因此 Where 不会出现在 Select 之前


如果你执行:

        var newLinqCustomer = customers.Select(c => new { c.Id, c.Name})
.Where(p => p.Id == 2 | p.Id == i).ToList();

然后Where在匿名类型的IEnumerableIQueryable上执行。


如果你执行:

        var newLinqCustomer = customers.Where(p => p.Id == 2 | p.Id == i)
.Select(c => new { c.Id, c.Name}).ToList();

然后在客户类型的IEnumerableIQueryable上执行Where


我唯一能想到的是,也许您看到了一些生成的 SQL,其中 SELECT 和 WHERE 被重新排序?在这种情况下,我猜想在(例如)LINQ to SQL 的某处有一个优化步骤。提供程序采用 SELECT Id, Name FROM (SELECT Id, Name FROM Customer WHERE Id=2 || Id=@i) 并将其转换为 SELECT Id, Name FROM Customer WHERE Id=2 || Id=@i - 但这必须是提供商特定的优化。

关于c# - LINQ 表达式如何知道 Where() 在 Select() 之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6801963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com