在Datatable上返回Linq的类型

时间:2018-01-23 09:25:10

标签: vb.net linq uipath

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

LINQ:

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"))

问题 enter image description here

任何帮助将不胜感激。

更新1:

表格结构

enter image description here

需要的表格结构

enter image description here

2 个答案:

答案 0 :(得分:0)

我对你想要的最终结果感到困惑。可以指导您但不完全符合您要求的想法是您可以将DataTable更改为匿名投影,然后从中获得您想要的内容。您可以从DataTable中选择一个“选择”,进入您想要选择的“什么”的扩展方法。如果我要在'new'之后做一个没有任何类或容器对象的新{},那么我将仅限于一个方法。当您想要在特定用途中为特定用途塑造某些东西时,这是一个很好的优势。

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,但坦率地说DataTables就像WinForms。他们完成了工作,但是他们过时而且不友好,只需要一个结构良好的POCO就能轻松完成Linq。如果你开始使用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());

答案 1 :(得分:0)

您可以在注释中创建一个linq,只需返回一个字符串数组列表:

result of 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

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

create newDatatable

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

Add data row properties

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

Output data table