Агрегатные функции в 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.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.