Комплекс GROUP BY на DataTable

1

У меня есть сложный объект 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()
    });
});
  • Как мы можем создать необходимый список из DataTable

ЛИТЕРАТУРЫ

  • 0
    вы используете ef или linq to sql?
  • 1
    Вы также должны рассмотреть возможность использования ConcurrentBag<T> . List<T> не является потокобезопасным.
Показать ещё 8 комментариев
Теги:
linq

1 ответ

1
Лучший ответ

Я предполагаю, что ваш запрос базы данных возвращает соединение между 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();
  • 0
    У меня похожая проблема с динамической группировкой с использованием LINQ. Можете ли вы посмотреть здесь ?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню