0

我有一个包含两列 ID 和角色的数据表。同一个 ID 可以有多个角色。我需要将此表转换为逗号分隔的分组表。我正在尝试使用以下查询,但无法解决问题。

林克:

From row As DataRow In dtData.Rows.Cast(Of DataRow)
Group row By id = row.Field(Of Integer)("ID") Into Group
Select ID, Role = String.Join(",", From i In Group Select i.Field(Of String)("Role"))

问题 在此处输入图像描述

任何帮助将不胜感激。

更新1:

表结构

在此处输入图像描述

需要的表结构

在此处输入图像描述

4

2 回答 2

0

您可以在评论中创建一个 linq,只是这会返回一个字符串数组列表:

linq的结果

这是代码:

(From row As DataRow In myDatatable
Group row By id = row.Field(Of String)("ID") Into Group
Select {id, String.Join(",", From i In Group Select i.Field(Of String)("Role"))}).ToList

如果您需要数据表中的结果,您可以构建一个新的数据表

创建新数据表

为每个结果创建一个并使用活动添加数据行。在 ArrayRow 添加项目并在 DataTable 中添加新数据表

添加数据行属性

如果您使用活动输出数据表,您可以看到结果

输出数据表

于 2018-01-25T17:52:33.143 回答
0

我对您想要的最终结果感到困惑。一个可能会指导您但不完全是您想要的想法是您可以将 DataTable 更改为匿名投影,然后从中获得您想要的东西。您可以从 DataTable 中执行“选择”,该数据表进入您要选择的“什么”的扩展方法。如果我要在“新”之后执行一个没有任何类或容器对象的新 {},那么我的范围将仅限于一个方法。当您想以一种方法为特定用途塑造某些东西以针对特定视图量身定制时,这是一个很好的优势。

static void Main(string[] args)
{
        DataTable d = new DataTable();
        d.Columns.Add("ItemName", typeof(string));
        d.Columns.Add("MinValue", typeof(float));
        d.Columns.Add("MaxValue", typeof(float));

        d.Rows.Add("Widget1", 0.1, 0.2);
        d.Rows.Add("Widget2", 0.2, 0.4);
        d.Rows.Add("Widget3", 0.1, 0.2);

        var dataTable = d.AsEnumerable();

        //What do you want to select?  The new {} without an indicator means anonymous type projection.  This will exist only in 
        // the scope listed.
        var data = dataTable.Select(x => new { ItemName = x[0], MinValue = x[1], MaxValue = x[2] }).ToList();

        //My 'data' type is now well typed for it's properties in the scope it's in.
        var joined = String.Join(", ", data.Select(x => x.ItemName).ToList());

        Console.WriteLine(joined);
        Console.WriteLine($"{data.Count}");

        Console.ReadLine();
}

编辑 1-26-18 奇怪我以为我昨天更新了代码。要获得一个可以将前端绑定到的可重用对象,您只需像这样创建一个 POCO:

 public class Foo
 {
     public string Bar { get; set; }
     public string MinAndMax { get; set; }
 }

虽然您可以制作另一个 DataTable,但坦率地说,DataTable 就像 WinForms。他们完成了工作,但他们过时并且不友好地使用 Linq 就像一个结构良好的 POCO 一样容易。如果你开始使用 Linq,它会更好地处理格式良好的对象,并且它们很容易创建。

 var data = dataTable.Select(x => new Foo { Bar = x[0].ToString(), MinAndMax = $"{x[1]} {x[2]}" }).ToList();

 //My 'data' type is now well typed for 'Foo' class and it's properties in the scope it's in.
 var joined = String.Join(", ", data.Select(x => $"{x.Bar} {x.MinAndMax}").ToList());
于 2018-01-23T17:43:45.350 回答