使用LINQ对DataTable进行分组

时间:2014-04-22 21:22:17

标签: c# linq

我在DataSet下面有3个表,

DataSet ds = new DataSet();
DataTable table1 = new DataTable("table1");
table1.Columns.Add("ParentId", typeof(int));
table1.Columns.Add("ParentName", typeof(string));

        table1.Rows.Add(1, "Name1");
        table1.Rows.Add(2, "Name2");


        DataTable table2 = new DataTable("table2");
        table2.Columns.Add("ChildId", typeof(int));
        table2.Columns.Add("ParentId", typeof(int));
        table2.Columns.Add("ChildRowName", typeof(string));
        table2.Columns.Add("ChildColumnName", typeof(string));

        table2.Rows.Add(1, 1, "ChildRowName1", "Column1");
        table2.Rows.Add(2, 1, "ChildRowName1", "Column2");
        table2.Rows.Add(3, 2, "ChildRowName2", "Column3");
        table2.Rows.Add(3, 2, "ChildRowName2", "Column4");


        DataTable table3 = new DataTable("table4");
        table3.Columns.Add("ChildListId", typeof(int));
        table3.Columns.Add("ChildId", typeof(int));
        table3.Columns.Add("Attribute1", typeof(string));
        table3.Columns.Add("Attribute2", typeof(string));

        table3.Rows.Add(1, 1,"=", "Equals");
        table3.Rows.Add(2, 1, "=", "Equals");
        table3.Rows.Add(2, 2, "Cont", "Contains");
        table3.Rows.Add(2, 3, "<", "LessThan");     

我在Class下面填充了Datatable中的List

public class Parent
{
    public string Name { get; set; }
    public IEnumerable<Child> childs { get; set; }

}

public class Child
{
    public string Name { get; set; }

    public IEnumerable<ChildList> items { get; set; }


}

public class ChildList
{
    public string Name { get; set; }
    public IEnumerable<ChildListAttribute> attributes { get; set; }

}

public class ChildListAttribute
{
    public string ColumnHeader { get; set; }
    public string Attribute1 { get; set; }
    public string Attribute2 { get; set; }

}

我在LINQ查询下使用,但Child始终为零。

from p in ds.Tables[0].AsEnumerable()
                           select new Parent
                           {
                               Name = p["ParentName"].ToString(),
                               childs = from c in ds.Tables[1].AsEnumerable()
                                        where p["ParentId"] == c["ParentId"]
                                        group c by c["ChildRowName"] into groupitems
                                                 select new Child
                                                 {
                                                     Name =      groupitems.First().Field<string>("ChildRowName").ToString(),
                                                     items = from item in groupitems
                                                                     select new ChildList
                                                                     {
                                                                         Name = item["ChildColumnName"].ToString(),
                                                                          attributes = from op in ds.Tables[2].AsEnumerable()
                                                                                       where item["ChildId"] == op["ChildId"]
                                                                                     select new ChildListAttribute
                                                                                     {
                                                                                         Attribute1 = op["Attribute1"].ToString(),
                                                                                           Attribute2 = op["Attribute2"].ToString(),

                                                                                     }
                                                                     }

                                                 }
                           }).ToList();

请告诉我,查询有什么问题?

1 个答案:

答案 0 :(得分:0)

首先,您需要在运行查询之前将表添加到DataSet,这可能是您已经在做的,但只是想确保:

ds.Tables.Add(table1);
ds.Tables.Add(table2);
ds.Tables.Add(table3);

由于你的where子句,孩子们没有填充:

where p["ParentId"] == c["ParentId"]

它应该是:

where p["ParentId"].ToString() == c["ParentId"].ToString()

where (int)p["ParentId"] == (int)c["ParentId"]

这是因为row[column]返回object,而不是列中存储的值。因此,当你比较它们时,你正在比较物体本身是否相等,而不是它们。您想测试这些对象的是否相等。

您需要通过连接值来获取属性,而不是对象本身。

where item["ChildId"] == op["ChildId"]

应该是

where item["ChildId"].ToString() == op["ChildId"].ToString()

如果能为您提供,请告诉我们。