Группа Linq с счетчиком возврата - PullRequest
0 голосов
/ 14 июля 2020

Net ядро ​​и Linq. У меня есть таблица, как показано ниже

Таблица заказов

OrderId   Status
1         New
2         New
3         In Progress
4         In Progress
5         Closed
6         Closed

У меня модель ниже

public class SummaryEntity
 { 
  public int New { get; set; }
  public int InProgress { get; set; }
  public int Closed { get; set; }
 }

Затем мне нужно вернуться и привязать к модели ниже, как показано ниже

New : 2
InProgress : 2
Closed : 2 

Я пробовал что-то вроде ниже

SummaryEntity result = (from item in Orders
                          group item by new { item.Status } into g
                          select new SummaryEntity{ //not sure how to get count and assign it to model }
                           );

Мне трудно сгруппировать и присвоить значения модели. Может ли кто-нибудь помочь мне написать запрос. Любая помощь будет оценена. Спасибо

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Вы уже сгруппировали элементы по статусу, поэтому g.Key будет содержать значение статуса, а g сам является перечислимым из сгруппированных элементов. Если вы хотите рассчитать их количество, используйте Count(), например:

var counts = from item in Orders
             group item by new { item.Status } into g
             select new {status=g.Key, count=g.Count()};

Это вернет один объект для каждого значения статуса с его количеством. Получение разных столбцов для каждого статуса - это, по сути, поворот, преобразование строк в столбцы.

Однако в этом случае, если вы знаете имена статусов заранее, вы можете преобразовать результаты в словарь и получить счетчики по имени , например:

var dict=counts.ToDictionary(x=>x.status,x=>x.count);

var model= new SummaryEntity 
           {
               New        = dict.TryGetValue("New",out var c_n)
                            ? c_n : 0,
               InProgress = dict.TryGetValue("InProgress",out var c_p)
                            ? c_p : 0,
               Closed     = dict.TryGetValue("Closed",out var c_c)
                            ? c_c : 0,
           };

Dictionary.TryGetValue используется, чтобы избежать исключений, если значение статуса отсутствует

0 голосов
/ 14 июля 2020

В твоей модели нет смысла. У вас есть только статус не Новый, Выполняется, Закрыто. Попробуйте следующее:

            DataTable dt = new DataTable();
            dt.Columns.Add("OrderId", typeof(int));
            dt.Columns.Add("Status", typeof(string));
            
            dt.Rows.Add( new object[] { 1, "New"});
            dt.Rows.Add( new object[] { 2, "New"});
            dt.Rows.Add( new object[] { 3, "In Progress"});
            dt.Rows.Add( new object[] { 4, "In Progress"});
            dt.Rows.Add( new object[] { 5, "Closed"});
            dt.Rows.Add( new object[] { 6, "Closed"});

            var results = dt.AsEnumerable()
                .GroupBy(x => x.Field<string>("Status"))
                .Select(x => new { status = x.Key, count = x.Count() })
                .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...