具有潜在分组层的 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信息”是什么意思?怎么加?怎么代表?怎么用的? 我只是编辑了我的问题,希望对您有所帮助。 所以dims
是List<dim>
类型(类型是C# 中的键)。 b
是 IGrouping<Tanon1, Tanon2>
类型,在 ToList
之后是 List<anon2>
。您不能将 List<anon2>
隐式转换为 List<dim>
。
【参考方案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 问题的主要内容,如果未能解决你的问题,请参考以下文章