У меня есть сложный объект CostPageDTO
, как показано ниже:
public class CostPageDTO
{
public string CostPageNumber { get; set; }
public string Description { get; set; }
public char OrderType { get; set; }
public string VendorName { get; set; }
public List<ItemDTO> Items { get; set; }
}
public class ItemDTO
{
public string BrandCode { get; set; }
public string ItemDescription { get; set; }
public string ItemID { get; set; }
}
Нам нужно создать List<CostPageDTO>
из datatable
. Я начал, как показано ниже: но я не уверен, как применить предложение GROUP BY здесь, чтобы создать List<ItemDTO>
внутри CostPageDTO.
DataTable table = new DataTable();
SqlDataReader reader = command.ExecuteReader();
table.Load(reader);
reader.Close();
List<CostPageDTO> costPages = new List<CostPageDTO>();
Parallel.ForEach(table.AsEnumerable(), (dr) =>
{
costPages.Add(new CostPageDTO()
{
CostPageNumber = dr[0].ToString(),
Description = dr[1].ToString(),
OrderType = Convert.ToChar(dr[2].ToString()),
VendorName = dr[3].ToString()
});
});
ЛИТЕРАТУРЫ
Я предполагаю, что ваш запрос базы данных возвращает соединение между CostPage и Item. Если это так, сначала вам нужно сгруппировать свои строки, чтобы получить значения для CostPage, после этого проекта для вашего типа DTO. Я действительно сомневаюсь, что вы увидите много преимуществ при распараллеливании кода.
Ваш код должен выглядеть примерно так:
costPages = table.AsEnumerable().GroupBy(dr=> new
{
CostPageNumber = dr[0].ToString(),
Description = dr[1].ToString(),
OrderType = Convert.ToChar(dr[2].ToString()),
VendorName = dr[3].ToString()
})
.Select(x => new CostPageDTO(){
CostPageNumber = x.Key.CostPageNumber,
Description = x.Key.Description,
OrderType = x.Key.OrderType,
VendorName = x.Key.VendorName,
Items = x.Select(dr=> new ItemDTO{
//ItemDTO mapping goes here
ItemID=dr[Constants.SearchPage.ITMID].ToString()
}).ToList()
}).ToList();
ConcurrentBag<T>
.List<T>
не является потокобезопасным.