Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
C# 以下两个LINQ查询之间有什么不同_C#_Linq - Fatal编程技术网

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,第二个不可能给出期望的结果。显示的代码是非法的。