LINQ GroupBy

Всем доброго времени суток. На связи Алексей Гулынин. Продолжаем работать с LINQ To Entities. В данной статье я бы хотел рассказать о группировке данных, используя LINQ. Для чего может потребоваться группировка. Допустим, у нас имеется таблица с заказами. Каждая запись в таблице представляет собой набор полей, в которых есть информация о заказчике, о товаре (который он купил) и о стоимости данного товара. Если мы хотим получить информацию следующего формата "ФИО заказчика | Количество заказов | Общая сумма заказов", то для этого придётся использовать группировку данных.
Создадим простую таблицу, которая будет хранить название страны и города в ней. Будем группировать по стране с указанием количества городов.
Класс "Country" будет иметь следующий вид:
class Country { // id public int Id { get; set; } // Название страны public string Name { get; set; } // Город public string City { get; set; } }
Для группировки данных по определенным параметрам используются оператор group by или метод GroupBy().
Основной код:
static void Main(string[] args) { Database.SetInitializer(new DropCreateDatabaseAlways<MyEFDB>()); using (MyEFDB db = new MyEFDB()) { // Создаём список объектов для добавления в БД List<Country> countriesList = new List<Country> { new Country { Name = "Russia", City = "Moscow"}, new Country { Name = "Russia", City = "Rostov" }, new Country { Name = "Russia", City = "Kazan" }, new Country { Name = "Russia", City = "Ufa" }, new Country { Name = "England", City = "London" }, new Country { Name = "England", City = "Manchester" }, new Country { Name = "England", City = "Liverpool" }, new Country { Name = "France", City = "Paris" }, new Country { Name = "France", City = "Monako" } }; db.Countries.AddRange(countriesList); db.SaveChanges(); // оператор group by var countries = from c in db.Countries group c by c.Name; foreach (var c in countries) { Console.WriteLine("{0} - количество городов: {1}", c.Key, c.Count()); } // метод GroupBy() var countries2 = db.Countries.GroupBy(c => c.Name); foreach (var c in countries2) { Console.WriteLine("{0} - количество городов: {1}", c.Key, c.Count()); } } Console.WriteLine("Нажмите клавишу для продолжения..."); Console.ReadLine(); }
Под хайдом приведу остальной код:
Строка подключения будет иметь следующий вид:
<connectionStrings> <add name="MyEFDB" connectionString="data source=(LocalDb)\v11.0;initial catalog=MyEFDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" /> </connectionStrings>
Класс "MyEFDB" (контекст) будет иметь следующий вид:
using System.Data.Entity; namespace TestProject { class MyEFDB: DbContext { public MyEFDB(): base("name=MyEFDB") { } public virtual DbSet<Country> Countries { get; set; } } }
Как мы видим, результат получился одинаковым.
В данном случае свойство Key — это ключ, по которому мы выполняем группировку. Метод Count() возращает количество сгруппированных записей.
В качестве домашнего задания можете реализовать тот пример, о котором я писал в начале статьи. Необходимо создать класс, в котором будет имя заказчика, наименование товара и его стоимость. Далее в БД необходимо добавить несколько записей. Необходимо вывести информацию в следующем формате: "ФИО заказчика | Количество заказов | Общая сумма заказов". Сумму можно посчитать с помощью метода Sum().
В данной статье вы познакомились с методом GroupBy() в LINQ.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.