LINQ OrderBy
Всем доброго времени суток. На связи Алексей Гулынин. Продолжаем работать с LINQ To Entities. В данной небольшой статье я бы хотел рассмотреть, как происходит сортировка данных, полученных из базы. В SQL для этого служит оператор ORDER BY. Если мы хотим отсортировать данные в обратном порядке, то используем оператор DESC.
В LINQ для сортировки полученных данных по возрастанию имеется метод OrderBy() или оператор orderby.
Давайте на примере рассмотрим их более подробно. Будем использовать ту же базу данных, что и в прошлой статье:
using System;
using System.Data.Entity;
using System.Collections.Generic;
using System.Linq;
namespace TestProject
{
class Program
{
static void Main(string[] args)
{
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();
// OrderBy - сортировка по возрастанию имени столицы страны
IQueryable<Country> countries = db.Countries.OrderBy(c => c.Capital);
ShowInfo(countries);
// Оператор orderby
countries = from c in db.Countries
orderby c.Capital
select c;
ShowInfo(countries);
// OrderByDescending - сортировка по убыванию имени столицы страны
countries = db.Countries.OrderByDescending(c => c.Capital);
ShowInfo(countries);
// Оператор descending
countries = from c in db.Countries
orderby c.Capital descending
select c;
ShowInfo(countries);
// Сортировка данных по нескольким критериям
var countries_result = db.Countries.Select(p => new { p.Name, p.Capital, p.Population})
.OrderBy(p => p.Name)
.ThenBy(p => p.Population);
Console.WriteLine("*******************************************");
foreach (var country in countries_result)
{
Console.WriteLine("{0} : {1} | {2}", country.Name, country.Capital, country.Population);
}
Console.WriteLine("*******************************************");
// Тот же самый пример только написанный по-другому и с использованием операторов
var countries_result2 = from c in db.Countries
orderby c.Name, c.Population
select c;
Console.WriteLine("*******************************************");
foreach (var country in countries_result)
{
Console.WriteLine("{0} : {1} | {2}", country.Name, country.Capital, country.Population);
}
Console.WriteLine("*******************************************");
}
Console.WriteLine("Нажмите клавишу для продолжения...");
Console.ReadLine();
}
// Выводим информацию о выборке
public static void ShowInfo(IQueryable<Country> countries)
{
Console.WriteLine("*******************************************");
foreach (var country in countries)
{
Console.WriteLine("{0} : {1}", country.Name, country.Capital);
}
Console.WriteLine("*******************************************");
}
}
}
Пройдёмся немного по методам, которые там используются:
- Метод OrderBy() или оператор orderby используются для сортировки по возрастанию.
- Метод OrderByDescending() или оператор descending используются для сортировки по убыванию.
- Методы ThenBy() (сортировка по возрастанию) и ThenByDescending() (сортировка по убыванию) используются при сортировке данных по нескольким критериям.
Под хайдом приведу остальной код:
Класс "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.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.



