Заполнение свойств объекта из DataSet с использованием LINQ - PullRequest
2 голосов
/ 21 января 2011

Вот мои нынешние отношения

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

Отношение многие-ко-многим (одно событие для многих категорий)

Вот как я заполняю свой DTO, используя цикл foreach

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

У меня есть больше полей в моем фактическом коде. Я хочу заменить цикл foreach запросом LINQ. Это возможно?

1 Ответ

4 голосов
/ 21 января 2011

То есть вы в основном преобразуете каждый 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 или от того, можете ли вы установить для него новую коллекцию или список категорий.

Затем можно объединить внешний для-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

...