2011-01-21 4 views
2

Вот мои текущих отношенияЗаполнение свойств объекта из DataSet с помощью LINQ

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 (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. Это возможно?

+0

на самом деле, что отношения многие-ко-многим , Одно событие может иметь несколько категорий, но одна категория может использоваться для нескольких событий. – SWeko

ответ

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

Вы можете объединить внешнее по-каждый следующим образом:

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

+0

привет, это хороший ответ. Можно ли также исключить «foreach (строка DataRow в eventsTable.Rows)» преобразовать его в запрос LINQ и добавить свой ответ в качестве подзапроса в новый запрос LINQ. –

+0

Несомненно .... см. Мой обновленный ответ. Пожалуйста, проголосуйте/отметьте как ответ, если вы довольны этим. – ColinE

+0

hi coline, у меня нет. Метод выбора в разделе Строки –