这是我目前的关系
DataRelation relation = new DataRelation("EventCategoryRelation", eventsTable.Columns["event_id"], eventCategoriesTable.Columns["event_id"]);
ds.Tables.Add(eventsTable);
ds.Tables.Add(eventCategoriesTable);
ds.Relations.Add(relation);
以下是表格的快速浏览
EventsTable
event_id | event_description
1 || "First Event"
EventCategoriesTable
event_category_id || event_id || category_id
1 || 1 || 1
2 || 1 || 2
关系多对多(一个事件属于多个类别)
以下是我使用foreach循环填充DTO的方法
foreach (DataRow row in eventsTable.Rows)
{
Event events = new Events();
events.Description = row["event_description"].ToString();
DataRow[] aDr = row.GetChildRows("EventCategoryRelation");
foreach (DataRow dr in aDr)
{
Categories category = new Categories();
category.CategoryID = Int64.Parse(dr["category_id"].ToString());
events.CategoryList.Add(category);
}
}
我的实际代码中有更多字段。我想用LINQ查询替换foreach循环。这可能吗?
答案 0 :(得分:4)
所以你基本上将每个DataRow转换为Categories对象并将它们添加到事件中?你可以通过使用Linq Select来实现这一点(这被称为投影)。
创建类别列表...
DataRow[] aDr = row.GetChildRows("EventCategoryRelation");
var categoryList = aDr.Select(row => new Categories()
{
category.CategoryID = Int64.Parse(dr["category_id"].ToString());
});
// add them to your event
events.CategoryList.AddRange(categoryList);
// or ...
events.CategoryList = categoryList.ToList();
最后一步,您将类别添加到事件中取决于CategoryList的类型,是否具有AddRange方法,或者是否可以将其设置为新的集合或类别列表。
然后您可以将外部for-each组合如下:
var eventsList = eventsTable.AsEnumerable().Select(eventRow => new Events()
{
Description = eventRow["event_description"].ToString(),
CategoryList = eventRow.GetChildRows("EventCategoryRelation")
.Select(row => new Categories()
{
category.CategoryID = Int64.Parse(row["category_id"].ToString());
})
.ToList()
}
请注意,这在DataTable上使用以下扩展方法:
http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable.aspx