Подсчет записей в C# с помощью LINQ

У меня есть простой SQL-запрос:

Select ID, COUNT(ID) as Selections, OptionName, SUM(Units) as Units
FROM tbl_Results
GROUP BY ID, OptionName

Результаты, которые я получил, были:

'1' '4' 'Approved'    '40' 
'2' '1' 'Rejected'    '19'
'3' '2' 'Not Decided' '12'

Я должен зашифровать данные в базе данных, и как таковой не может суммировать данные в реляционной форме. Для обхождения этого, я дешифрую данные на прикладном уровне и хочу использовать LINQ для запросов его там. Мне нужны следующие результаты:

'1' 'Approved'     '10'
'3' 'Not Deceided' '6'
'2' 'Rejected'     '19'
'1' 'Approved'     '15'
'1' 'Approved'     '5'
'3' 'Not Deceided' '6'
'1' 'Approved'     '10'

Я поместил эти результаты в класс и создаю список со строгим контролем типов:

public class results
{
 public int ID {get;set;}
 public string OptionName {get;set;}
 public int Unit {get;set;}
}

У меня почти есть запрос LINQ для возвращения результатов как SQL-запрос о:

var q = from r in Results
        group p.Unit by p.ID
        int g
        select new {ID = g.Key,
                    Selections = g.Count(),
                    Units = g.Sum()};

Как я удостоверяюсь, чтобы мой запрос LINQ также дал мне Option Name?

Если я создал названный класс Statistics содержать мои результаты, как я изменил бы запрос LINQ, чтобы дать мне List<Statistics> набор результатов?

public class results
    {
     public int ID {get;set;}
     public int NumberOfSelections { get; set; }
     public string OptionName {get;set;}
     public int UnitTotal {get;set;}
    }
5
задан George Stocker 27 June 2010 в 17:40
поделиться

2 ответа

Сейчас вы просто группируете по ID. Вместо этого, в соответствии с исходным запросом, вам нужно группировать и по имени опции. Таким образом, ключ каждой группы будет содержать и ID, и название опции. Вот это изменение:

var q = from r in Results
        group r.Unit by new { p.ID, p.OptionName } into g
        select new { ID = g.Key.ID,
                     OptionName = g.Key.OptionName
                     Selections = g.Count(),
                     UnitTotal = g.Sum() };

Теперь я не сразу понял, что вы выбираете только часть "единица" для элемента группы. Я пропустил "group p.Unit by" в выражении запроса. Моя ошибка... но другие могут поступить так же. Вот альтернативный вариант, в котором группа содержит элементы, а затем суммирует единицы в проекции:

var q = from r in Results
        group r by new { p.ID, p.OptionName } into g
        select new { ID = g.Key.ID,
                     OptionName = g.Key.OptionName
                     Selections = g.Count(),
                     UnitTotal = g.Sum(x => x.Unit) };
4
ответ дан 14 December 2019 в 19:09
поделиться

Этот запрос группирует по id и имени опции, делая его доступным:

var q = from r in Results
        group p.Unit by new { ID = p.ID, OptionName = p.OptionName } into g
        select new {
            ID = g.Key.ID,
            OptionName = g.Key.OptionName,
            Selections = g.Count(),
            Units = g.Sum()
        };

Для возврата пользовательского класса результатов используйте:

var q = from r in Results
        group p.Unit by new { ID = p.ID, OptionName = p.OptionName } into g
        select new results() {
            ID = g.Key.ID,
            OptionName = g.Key.OptionName,
            NumberOfSelections = g.Count(),
            UnitTotal = g.Sum()
        };
1
ответ дан 14 December 2019 в 19:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: