使用linq进行分组,然后运行带有where条件的select查询

时间:2015-10-27 12:10:41

标签: c# linq

我有一个类,OrderInfo如下所示,

 class OrderInfo
 {
    string Product
    boolean NoIssues
 }

我有一个OrderInfo列表。我想做的是知道每个产品是否存在问题。以下是我的清单示例。

 ProductList

 Product      NoIssues
 ABC          true
 ABC          true
 ABC          false
 ABC          true
 EFG          true
 EFG          true
 EFG          true
 EFG          true
 EFG          true

以下是我想要的结果。

Result      
ABC       false
EFG       true

因此,我将使用LINQ按产品分组以获取唯一的产品列表,然后循环浏览此列表以运行选择查询,其中我过滤NoIssues = false。但是不确定如何做到这一点或者这是最好的方法

 var res = (from ord in ProductList
            group ord by ord.Product).ToList()

所以我相信上面的代码会给我一个我可以循环的唯一产品列表。但是不确定如果我使用带有where条件且不返回任何内容的select语句会发生什么?

2 个答案:

答案 0 :(得分:5)

您可以使用All: -

List<OrderInfo> result = list.GroupBy(x => x.Product)
                             .Select(x => new OrderInfo
                                       {
                                           Product = x.Key,
                                           NoIssues = x.All(z => z.NoIssues)
                                       }).ToList();

或者如果您更喜欢查询语法: -

List<OrderInfo> result = (from ord in ProductList
                         group ord by ord.Product into g
                         select new OrderInfo
                               {
                                    Product = g.Key,
                                    NoIssues = g.All(x => x.NoIssues)
                               }).ToList();

答案 1 :(得分:1)

如果您不想为此创建新的Product对象,我会选择:

var result = from product in ProductList
             group product by product.Product into productGroup
             select productGroup.Where(p => !p.NoIssues)
                                .DefaultIfEmpty(productGroup.First())
                                .First();

否则,@ Rahul Singh的答案更直观。