使用LINQ从DataSet填充对象属性

时间:2011-01-21 08:33:21

标签: c# .net linq dataset datarelation

这是我目前的关系

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

1 个答案:

答案 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