我有一个带有两列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"))
任何帮助将不胜感激。
更新1:
表格结构
需要的表格结构
答案 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,只需返回一个字符串数组列表:
以下是代码:
(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中添加新数据表
如果您使用活动输出数据表,则可以看到结果