LINQ GroupBy

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.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *