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




