具有潜在分组层的 C# LINQ 问题

Posted

技术标签:

【中文标题】具有潜在分组层的 C# LINQ 问题【英文标题】:C# LINQ question with potential group-by layers 【发布时间】:2021-01-22 17:42:02 【问题描述】:

我是 linq 的新手,所以任何建议都非常有帮助。假设我有一个数据集看起来像

acct    dim         unit_code
10000   DIMENSION2  100
10000   DIMENSION2  1000
10000   DIMENSION2  1300
10000   DIMENSION2  1400
20000   DIMENSION2  1500
20000   DIMENSION2  200
20000   DIMENSION2  600
20000   DIMENSION2  700
20000   DIMENSION2  800
20000   DIMENSION2  900
10000   DIMENSION3  FGAC
10000   DIMENSION3  FGCP
10000   DIMENSION3  FGCV
10000   DIMENSION3  FGED
20000   DIMENSION3  FGES
20000   DIMENSION3  FGGM
20000   DIMENSION3  FGLD
20000   DIMENSION3  FGNB
20000   DIMENSION3  FGOR
20000   DIMENSION3  FGPM
10000   DIMENSION4  ENDO
20000   DIMENSION4  OTHR
20000   DIMENSION4  POTN

这是我的课

public class RestrictionRule

    public string acct  get; set; 
    public List<dim> dims  get; set; 

public class dim

     public string dim  get; set; 
     public List<unit_code> unit_codes   get; set; 

public class unit_code

     public string unit_code get; set; 
     public string unit_code_description   get; set; 

我尝试返回 RestrictionRule 类,所以我开始编写类似的东西

var result = (from a in dataset
              group a by new
              
                a.acct,
                a.dim,
               into b
              select new RestrictionRule()
              
                acct = b.Key.acct,
                dims = b.ToList(),
              );

此时,我不确定为什么我有针对“dims = b.ToList(),”。此外,由于 RestrictionRule 类在层次结构中有两个列表(Dim 和 unit_code),请建议我如何正确创建它。提前感谢大家的帮助。

【问题讨论】:

以图像形式的示例数据。很好,很容易复制粘贴到 LINQpad... 感谢提醒。我只是编辑它,所以它现在不是图像。 “我不知道为什么我有异常” - 什么异常? “添加unit_code信息”是什么意思?怎么加?怎么代表?怎么用的? 我只是编辑了我的问题,希望对您有所帮助。 所以dimsList&lt;dim&gt; 类型(类型是C# 中的键)。 bIGrouping&lt;Tanon1, Tanon2&gt; 类型,在 ToList 之后是 List&lt;anon2&gt;。您不能将 List&lt;anon2&gt; 隐式转换为 List&lt;dim&gt; 【参考方案1】:

您需要在每个级别进行分组以创建适当的类型:

var result = from d in dataset
             group d by d.acct into acctGroup
             select new RestrictionRule 
                acct = acctGroup.Key,
                dims = (from d in acctGroup
                        group d by d.dim into dimGroup
                        select new Dim 
                            dim = dimGroup.Key,
                            unit_codes = (from d in dimGroup
                                         select new UnitCode 
                                            unit_code = d.unit_code,
                                            // unit_code_description = ???
                                         )
                                         .ToList()
                        )
                        .ToList()
             ;

【讨论】:

【参考方案2】:

此 LINQ 查询不可转换为 SQL。 GROUP BY 只能返回聚合结果和探索键的字段。考虑客户端评估,因为您需要客户端上的所有记录。

var result = from a in dataset.AsEnumerable()
             group a by new
             
               a.acct,
               a.dim,
              into b
             select new RestrictionRule()
             
               acct = b.Key.acct,
               dims = b.ToList(),
             ;

【讨论】:

以上是关于具有潜在分组层的 C# LINQ 问题的主要内容,如果未能解决你的问题,请参考以下文章

Linq在C#中按2列分组[重复]

C# - LINQ - 按日期范围分组集合

LINQ C# 中的条件计数分组依据

C# LINQ - 按属性分组列表,然后按不同组选择

.NET(C#) System.Linq中实现多列group by(分组)的示例代码

如何在 LINQ C# 中仅过滤 2 列分组中的最后一个值