У меня есть простой 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;}
}
Сейчас вы просто группируете по 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) };
Этот запрос группирует по 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()
};