C#: 合并DataTable中的数据行

6
我有一个包含以下详细信息的数据表。
ID     |   VERSION  |   ENTITY
1      |    01      |   A01
1      |    01      |   A02
2      |    01      |   A01
2      |    01      |   A02

我希望将“实体”列的值合并如下。
ID     |   VERSION  |   ENTITY
1      |    01      |   A01/A02
2      |    01      |   A01/A02

有没有使用Linq实现它的方法?

1
你实际的需求是基于“ID”列对记录进行分组,是吗? - sujith karivelil
我实际的需求是根据ID和版本进行分组。 - akshay
我可以拥有像ID = 1和version = 2这样的值。 - akshay
所以应该使用 / 作为分隔符将所有组成员的 ENTITY 条目连接起来吗? - Mong Zhu
2个回答

3

您可以使用匿名类型按多个属性进行分组:

var result = list1.GroupBy(x=> new {x.ID, x.VERSION}).Select(
    item => new Example
    {
        ID = item.Key.ID, 
        VERSION = item.Key.VERSION,
        ENTITY = string.Join("/", item.Select(c=>c.ENTITY))
    });

之后选择相应的属性并将它们输入到所需类型的新对象中。
输出:

enter image description here

编辑:

在一个 DataTable 中,您需要通过 [ ] 操作符访问列,但分组的原则仍然相同:

示例 DataTable:

DataTable table = new DataTable();
table.Columns.Add("ID", typeof(int));
table.Columns.Add("VERSION", typeof(string));
table.Columns.Add("ENTITY", typeof(string));

table.Rows.Add(1, "01", "A01");
table.Rows.Add(1, "01", "A02");
table.Rows.Add(2, "01", "A01");
table.Rows.Add(2, "01", "A02");

分组:

var result = table.AsEnumerable().GroupBy(x => new { ID = x["ID"], VERSION = x["VERSION"]}).Select(
    item => new Example
    {
        ID = (int)item.Key.ID,
        VERSION = (string)item.Key.VERSION,
        ENTITY = string.Join("/", item.Select(c => c["ENTITY"]))
    });

有没有不用 LINQ 的方式?也就是说,通过迭代每一行来完成操作? - sampat nayak
嗨,我正在尝试使用您的代码片段。但我在“x.ID,x.VERSION”这一行出现错误了。系统数据 datarow 不包含 ID 的定义? - akshay
@akshay 抱歉,我没有仔细阅读。我编辑了我的答案并发布了一个可以与datatable一起使用的版本。结果你将得到一个IEnumerable<yourType>。如果你使用linq,你将始终收到这样的返回类型。 - Mong Zhu
@sampatnayak 当然可以。您需要一个单独的集合来收集结果。但基本思路是遍历行,检查两个列中的值并在字符串不同时扩展它。最后将这些值写入您的单独集合中。 - Mong Zhu

0

这个查询似乎有效:

var output = from d in DataTable
             group d.ENTITY by new { ID, VERSION } into grp
             select grp;

如果您正在使用类似于实体框架的东西,您可能需要使用 output.ToList() 来获取值。如果您想要在代码中访问 IDVERSION,您可以使用一个包含这两个属性的类,而不是使用 new { ID, VERSION }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接