Агрегатные функции в LINQ

Агрегатные функции в LINQ

Всем доброго времени суток. На связи Алексей Гулынин. Продолжаем работать с LINQ To Entities. В данной статье я бы хотел рассказать об использовании агрегатных функций в LINQ. В данном случае идёт обращение к встроенным функциям SQL через специальные методы, которые мы в этой статье и рассмотрим.

Будут рассмотрены следующие методы:

  1. Count() — количество.
  2. Sum() — сумма значений.
  3. Max() — максимум .
  4. Min() — минимум.
  5. Average() — среднее значение.

В SQL названия этих функций совпадает с названием методов LINQ, за исключением метода Average(). В SQL — функция AVG().

Ниже приведен код, в котором все эти методы (с комментариями) рассмотрены:

Database.SetInitializer(new DropCreateDatabaseAlways<MyEFDB>());

using (MyEFDB db = new MyEFDB())
{
  Country country1 = new Country { Name = "Russia", Capital = "Moscow", Population = 145000000 };
  Country country2 = new Country { Name = "France", Capital = "Paris", Population = 67000000 };
  Country country3 = new Country { Name = "England", Capital = "London", Population = 53000000 };
  Country country4 = new Country { Name = "Germany", Capital = "Berlin", Population = 82000000 };
  Country country5 = new Country { Name = "Spain", Capital = "Madrid", Population = 46000000 };

  db.Countries.AddRange(new List<Country> { country1, country2, country3, country4, country5 });
  db.SaveChanges();

  // 1. Count()
  // Получаем общее количество записей в таблице Countries
  int countriesNum = db.Countries.Count();
  Console.WriteLine("Количество записей в таблице Countries : {0}", countriesNum); //5

  // Получаем количество записей, в которых численность населения > 70000000 человек
  int countriesPopNum = db.Countries.Count(c => c.Population > 70000000);
  Console.WriteLine("Количество записей в таблице Countries (население > 70 млн. : {0}", countriesPopNum); //2

  // 2. Sum()
  // Посчитаем суммарное количество жителей во всех странах
  long populationSum = db.Countries.Sum(c => c.Population);
  Console.WriteLine("Численность населения в 5 странах : {0}", populationSum); // 393 млн.

  // 3. Max()
  // Получаем максимальную численность населения
  long popMax = db.Countries.Max(p => p.Population);
  // Получим страну с наибольшей численностью населения
  string countryPopMax = db.Countries.Where(c => c.Population == popMax).Select(c => c.Name).First();
  Console.WriteLine("Макс. населения: {0}", countryPopMax); // Russia

  // 4. Min()
  // Получаем максимальную численность населения
  long popMin = db.Countries.Min(p => p.Population);
  // Получим страну с наибольшей численностью населения
  string countryPopMin = db.Countries.Where(c => c.Population == popMin).Select(c => c.Name).First();
  Console.WriteLine("Мин. населения: {0}", countryPopMin); // Spain

  // 5. Average()
  // Получим среднюю численность населения по 5 странам
  double popAverage = db.Countries.Average(p => p.Population);
  Console.WriteLine("Средняя численность населения в 5 странах : {0}", popAverage); // 78,6 млн.

}

Под хайдом приведу остальной код:

Посмотреть код:

Класс "Country":

class Country
{
  // id
  public int Id { get; set; }
  // Название страны
  public string Name { get; set; }
  // Столица
  public string Capital { get; set; }
  // Численность населения
  public long Population { get; set; }
}

Строка подключения будет иметь следующий вид:

<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; }
  }
}

В данной статье мы рассмотрели использование агрегатных функций в LINQ.

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


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

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

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