2

这是我现在的关系

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

以下是表格的快速浏览

事件表

event_id | event_description

1 || "First Event"

事件类别表

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 循环。那可能吗?

4

1 回答 1

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

于 2011-01-21T08:43:27.720 回答