【问题标题】:Linq Query to Group By Multiple Columns But Get Additional PropertiesLinq 查询按多列分组但获取其他属性
【发布时间】:2015-11-11 15:01:37
【问题描述】:

我有一个包含许多重复记录的表。如何使用 C# Linq 查询按多个字段进行分组,同时获取不同记录的 ID。

例如:我有一个如下所示的 Store 表

Store
-----
ID, StoreName, Address1

1, CVS, 123 Main Street
2, CVS, 123 Main Street
3, CVS, 456 Main Street

我想先按 storeName 分组,然后按 address1 分组,还要获取第一个不同(storeName 和 address1)记录的 ID。

我只想要这两条记录:

1, CVS, 123 Main Street
3, CVS, 456 Main Street

我尝试使用匿名对象,但不知道如何在不按 ID 分组的情况下获取 ID。

【问题讨论】:

    标签: c# linq group-by


    【解决方案1】:

    当您在 LINQ 中使用 GroupBy 时,您将获得一个实现接口 IGrouping<TKey,TElement> 的类的可枚举 - TElement 代表已分组的单个和原始元素。

    所以你会这样分组

     var grouped = myList.GroupBy(x => new {x.StoreName,x.Address1});
    

    这将为您提供IGrouping<anonymous,Store> 的可枚举列表(假设原始对象称为Store)。 anonymous 是一个匿名对象,有两个属性 StoreNameAddress1

    现在,可枚举项中的每个项目本身Store 的可枚举项,您可以像对待任何其他可枚举项一样对待它——如果您愿意,可以使用First().ID,并且如果这就是你想要的,你可以将全部投射回一个可枚举的对象

    var result = myList.GroupBy(x => new {x.StoreName,x.Address1});
                       .Select(g => new {
                                      g.Key.StoreName, 
                                      g.Key.Address1, 
                                      FirstID = g.First().ID
                                    });
    

    【讨论】:

      【解决方案2】:

      这样的事情应该可以工作。您必须在不属于分组的字段上应用聚合:

      var result = list.GroupBy(c => new { c.StoreName, c.Address1 }).
                        Select(c => new
                        {
                            ID = c.Min(i => i.ID),
                            c.Key.StoreName,
                            c.Key.Address1
                        }).ToList();
      

      【讨论】:

        【解决方案3】:

        这是一些未经测试的伪代码,但你想要这样的东西

        storeList.GroupBy(s => new { s.Storename, s.Address1})
                 .SelectMany(g => g.First())
                 .ToList()
        

        【讨论】:

        • 是的,我是个混蛋,但你的答案看起来不错,再加一个
        • 不需要OrDefault,组里总有物品。
        猜你喜欢
        • 2013-09-23
        • 1970-01-01
        • 2021-07-30
        • 1970-01-01
        • 2021-10-22
        • 2017-12-19
        • 1970-01-01
        • 1970-01-01
        • 2014-01-02
        相关资源
        最近更新 更多