Агрегатные функции в LINQ
Всем доброго времени суток. На связи Алексей Гулынин. Продолжаем работать с LINQ To Entities. В данной статье я бы хотел рассказать об использовании агрегатных функций в LINQ. В данном случае идёт обращение к встроенным функциям SQL через специальные методы, которые мы в этой статье и рассмотрим.
Будут рассмотрены следующие методы:
- Count() — количество.
- Sum() — сумма значений.
- Max() — максимум .
- Min() — минимум.
- 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.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.



