C# 以下两个LINQ查询之间有什么不同
我不理解以下查询与在什么条件下应该使用哪个查询之间的区别:C# 以下两个LINQ查询之间有什么不同,c#,linq,C#,Linq,我不理解以下查询与在什么条件下应该使用哪个查询之间的区别: var productGroups = from p in products group p by p.Category into g where g.Any(p => p.UnitsInStock == 0) select new { Category = g.Key, Products = g }; var productGroups =
var productGroups =
from p in products
group p by p.Category into g
where g.Any(p => p.UnitsInStock == 0)
select new { Category = g.Key, Products = g };
var productGroups =
from p in products
group p by p.Category into g
where g.Where(p => p.UnitsInStock == 0)
select new { Category = g.Key, Products = g };
区别在于第二个不是法律代码,不会编译
where g.Where(...)
g、 其中本身就是一个过滤操作。它产生一个任意类型的g序列。它不会产生布尔值,这是在另一个where表达式中将其用作谓词所需的
另一方面,g.Any。。。是一个返回布尔值的方法,允许您在查询的where子句中使用它
第一个查询是按类别对产品进行分组,然后筛选以选择库存为0的产品的组。只要该类别中的任何产品有0个库存单元,则该组将被选择为匿名类型,其中包括该类别,然后是该类别中的产品
如果你有
var products = new List<Product>
{
new Product { Category = "Widgets", Name = "Foo", UnitsInStock = 14 },
new Product { Category = "Widgets", Name = "Bar", UnitsInStock = 0 },
new Product { Category = "Frobbers", Name = "Baz", UnitsInStock = 32 },
new Product { Category = "Frobbers", Name = "Blah", UnitsInStock = 9 }
};
因此,在输出中没有区别,因为谓词是相同的。区别仅仅在于谓词的指定位置。在第一个查询中,它使用接受谓词的Any的重载,第二个一旦修复,则在通过Where方法应用谓词之后使用不带谓词的重载。这两种方法都是通过方法惰性地流式传输元素,只在必要时进行评估以验证条件。因此,使用哪个版本主要取决于您,我只选择接受谓词的任何版本。区别在于第二个版本不是法律代码,不会编译
where g.Where(...)
g、 其中本身就是一个过滤操作。它产生一个任意类型的g序列。它不会产生布尔值,这是在另一个where表达式中将其用作谓词所需的
另一方面,g.Any。。。是一个返回布尔值的方法,允许您在查询的where子句中使用它
第一个查询是按类别对产品进行分组,然后筛选以选择库存为0的产品的组。只要该类别中的任何产品有0个库存单元,则该组将被选择为匿名类型,其中包括该类别,然后是该类别中的产品
如果你有
var products = new List<Product>
{
new Product { Category = "Widgets", Name = "Foo", UnitsInStock = 14 },
new Product { Category = "Widgets", Name = "Bar", UnitsInStock = 0 },
new Product { Category = "Frobbers", Name = "Baz", UnitsInStock = 32 },
new Product { Category = "Frobbers", Name = "Blah", UnitsInStock = 9 }
};
因此,在输出中没有区别,因为谓词是相同的。区别仅仅在于谓词的指定位置。在第一个查询中,它使用接受谓词的Any的重载,第二个一旦修复,则在通过Where方法应用谓词之后使用不带谓词的重载。这两种方法都是通过方法惰性地流式传输元素,只在必要时进行评估以验证条件。因此,主要取决于您使用哪个版本,我只选择接受谓词的任何版本。当您尝试运行它们时会发生什么?它们都给出了所需的结果,但我不理解它们的可用性them@DewasishMitruka,第二个不可能给出期望的结果。显示的代码是非法的。当您尝试运行它们时会发生什么?它们都提供了所需的结果,但我不理解它们的可用性them@DewasishMitruka,第二个不可能给出期望的结果。显示的代码是非法的。