我在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();
请告诉我,查询有什么问题?
答案 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()
如果能为您提供,请告诉我们。