C#中的复杂分组依据

时间:2019-05-31 06:10:02

标签: c# group-by

我在数据库中有如下一组行

ID,CompName,identifier,DesId,SubId,SRO,PDiam
-----------------------------------------------
1,resistor,R1,10,20,30,45
2,resistor,R2,10,20,40,50
3,capacitor,C1,10,20,33,5
4,Inductor,I1,10,20,22,32
1,Inductor,I2,10,20,42,52

我试图将它们分组,并根据其标识符进行siplay,如下所示。 假设列分隔符是pipe(|)

Ids|CompName|SRO|PDiam
-------------------------------
R1,R2|resistor|30|45  //Since there are two resistors, 2 rows foreach SRO and Pdiam Pair
R1,R2|resistor|40|50  
C1|Capacitor|33|5 //One Row for Capacitor as only 1 component in DB and one pair of SRO and Pdiam Pair
I1,I2|Inductor|22|32 //2 Rows for 2 capacitors and 1 row for each pair of SRO and PDiam
I1,I2|Inductor|42|52

我知道我们应该使用group by,但是不确定如何高效地进行分组。我能想到的唯一方法是遍历Group by ComponentName和Identifier的结果,但是这对我来说似乎太复杂了。

有什么更好的方法可以实现这一目标?

1 个答案:

答案 0 :(得分:0)

您可以将表与表的聚合版本进行联接。汇总表将按CompName分组,并在标识符上使用字符串汇总功能。

SELECT G.Ids, T.compname, T.SRO, T.PDiam FROM
components T LEFT JOIN
(SELECT compname, STRING_AGG(identifier, ',') ids FROM components GROUP BY compname) G
ON T.compname = G.compname

(未经测试)

但是,字符串聚合在SqlServer 2017之前的T-SQL中是有问题的,因此可能很难做到。参见this post

如果您需要在EF中执行此操作,则方法将相同。不知道是否可以将字符串聚合函数“导出”到EF。 (应该是可能的。)

对于EF中的小数据,您可以使用类似this