Linq group by sum

I have a collection of products

Now I want to group the collection based on the product code and return an object containing the name, the number or products for each code and the total price for each product.

So I use a GroupBy to group by ProductCode, then I calculate the sum and also count the number of records for each product code.

This is what I have so far:

For some reason, the sum is done correctly but the count is always 1.

Result with sample data:

Product 1 should have count = 2!

I tried to simulate this in a simple console application but there i got the following result:

Product1: should only be listed once. The code for the above can be found on pastebin: http://pastebin.com/cNHTBSie

3 Answers 3

I don’t understand where the first "result with sample data" is coming from, but the problem in the console app is that you’re using SelectMany to look at each item in each group.

I think you just want:

The use of First() here to get the product name assumes that every product with the same product code has the same product name. As noted in comments, you could group by product name as well as product code, which will give the same results if the name is always the same for any given code, but apparently generates better SQL in EF.

I’d also suggest that you should change the Quantity and Price properties to be int and decimal types respectively — why use a string property for data which is clearly not textual?

Группирование — одна из самых эффективных функций LINQ. Grouping is one of the most powerful capabilities of LINQ. В приведенных ниже примерах демонстрируются различные способы группирования данных: The following examples show how to group data in various ways:

по отдельному свойству; By a single property.

по первой букве строкового свойства; By the first letter of a string property.

Читайте также:  Sp1 for windows 7 32 bit

по расчетному числовому диапазону; By a computed numeric range.

по логическому предикату или другому выражению; By Boolean predicate or other expression.

по составному ключу. By a compound key.

Кроме того, два последних запроса передают свои результаты в новый анонимный тип, содержащий только имя и фамилию студента. In addition, the last two queries project their results into a new anonymous type that contains only the student’s first and last name. Дополнительные сведения см. в разделе Предложение group. For more information, see the group clause.

Пример Example

Во всех примерах в этом разделе используются указанные ниже вспомогательные классы и источники данных. All the examples in this topic use the following helper classes and data sources.

Пример Example

В этом примере показана группировка элементов источника с помощью отдельного свойства элемента в качестве ключа группы. The following example shows how to group source elements by using a single property of the element as the group key. В данном случае в качестве ключа используется string , фамилия учащегося. In this case the key is a string , the student’s last name. Для ключа можно также использовать подстроку. It is also possible to use a substring for the key. При операции группирования используется компаратор проверки на равенство, используемый по умолчанию для данного типа. The grouping operation uses the default equality comparer for the type.

Вставьте приведенный ниже метод в класс StudentClass . Paste the following method into the StudentClass class. Измените оператор вызова в методе Main на sc.GroupBySingleProperty() . Change the calling statement in the Main method to sc.GroupBySingleProperty() .

Пример Example

В этом примере показана группировка элементов источника, когда в качестве ключа группы используется не свойство объекта. The following example shows how to group source elements by using something other than a property of the object for the group key. В данном случае в качестве ключа используется первая буква фамилии учащегося. In this example, the key is the first letter of the student’s last name.

Вставьте приведенный ниже метод в класс StudentClass . Paste the following method into the StudentClass class. Измените оператор вызова в методе Main на sc.GroupBySubstring() . Change the calling statement in the Main method to sc.GroupBySubstring() .

Читайте также:  Jquery дата и время

Пример Example

В этом примере показана группировка элементов источника путем использования числового диапазона в качестве ключа группы. The following example shows how to group source elements by using a numeric range as a group key. Затем запрос передает результаты в анонимный тип, содержащий только имя и фамилию, а также диапазон процентилей, к которому принадлежит студент. The query then projects the results into an anonymous type that contains only the first and last name and the percentile range to which the student belongs. Использование анонимного типа объясняется тем, что для отображения результатов не требуется использовать полный объект Student . An anonymous type is used because it is not necessary to use the complete Student object to display the results. GetPercentile — это вспомогательная функция, которая вычисляет процент на основе средних результатов учащегося. GetPercentile is a helper function that calculates a percentile based on the student’s average score. Метод возвращает целое число в диапазоне от 0 до 10. The method returns an integer between 0 and 10.

Вставьте приведенный ниже метод в класс StudentClass . Paste the following method into the StudentClass class. Измените оператор вызова в методе Main на sc.GroupByRange() . Change the calling statement in the Main method to sc.GroupByRange() .

Пример Example

В этом примере показана группировка элементов источника с помощью выражения логического сравнения. The following example shows how to group source elements by using a Boolean comparison expression. В этом случае логическое выражение проверяет, превосходит ли среднее значение экзаменационного результата учащегося 75 баллов. In this example, the Boolean expression tests whether a student’s average exam score is greater than 75. Как и в предыдущих примерах, результаты передаются в анонимный тип, так как весь элемент источника не требуется. As in previous examples, the results are projected into an anonymous type because the complete source element is not needed. Обратите внимание на то, что свойства в анонимном типе становятся свойствами в члене Key , а при выполнении запроса доступ к ним можно получить по имени. Note that the properties in the anonymous type become properties on the Key member and can be accessed by name when the query is executed.

Читайте также:  Звук который пугает мышей

Вставьте приведенный ниже метод в класс StudentClass . Paste the following method into the StudentClass class. Измените оператор вызова в методе Main на sc.GroupByBoolean() . Change the calling statement in the Main method to sc.GroupByBoolean() .

Пример Example

В этом примере показано, как использовать анонимный тип для инкапсуляции ключа, содержащего несколько значений. The following example shows how to use an anonymous type to encapsulate a key that contains multiple values. В данном случае в качестве первого значения ключа используется первая буква фамилии учащегося. In this example, the first key value is the first letter of the student’s last name. Второе значение ключа является логическим и указывает, набрал ли учащийся более 85 баллов на первом экзамене. The second key value is a Boolean that specifies whether the student scored over 85 on the first exam. Группы можно сортировать по любому из свойств в ключе. You can order the groups by any property in the key.

Enumerable.Sum is extension method from System.Linq namespace. It returns sum of numeric values in collection.

Sum for Numeric Types

Gets sum of values from list of integer numbers.

Gets sum of values from list of decimal numbers.

Calling Sum on empty collection returns 0.

Sum for Nullable Numeric Types

Gets sum of values from list of nullable integers.

Returns if the collection contains only null values.

Returns if the collection is empty.

Sum with Selector

This example sums lengths of all strings in the list.

Sum with Query Syntax

LINQ query expression to get sum of numeric values in the collection.

LINQ query expression to get sum of numbers which match specified predicate.

LINQ query expression to get sum of string lengths using selector.

Sum with Group By

This example shows how to calculate sum for each group. Lets have players. Each player belongs to a team and have a score. Team total score is sum of score of all players in the team.