Операции с набором в LINQ to SQL

Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6

Последнее обновление: 31.10.2015

Фильтрация и сортировка

Чтобы применить фильтрацию и сортировку в LINQ to SQL, мы можем воспользоваться стандартными операторами и выражениями LINQ. Например, выведем всех пользователей, у которых возраст больше 25 и упорядочим по имени:

string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";
DataContext db = new DataContext(connectionString);

var query = from u in db.GetTable<User>()
            where u.Age > 25
            orderby u.FirstName
            select u;
// или так
// var query = db.GetTable<User>().Where(u => u.Age > 25).OrderBy(u => u.FirstName);
foreach (var user in query)
{
    Console.WriteLine("{0} \t{1} \t{2}", user.Id, user.FirstName, user.Age);
}

Операторы where и orderby позволяют произвести сортировку. Причем в результате действия этого запроса будет сформировано sql-выражение:

SELECT [t0].[Id], [t0].[Name] AS [FirstName], [t0].[Age]
FROM [Users] AS [t0]
WHERE [t0].[Age] > 25
ORDER BY [t0].[Name]

Которое и возвратит все необходимые данные.

Группировка

Для группировки данных применяется оператор group by или аналогичный метод GroupBy():

string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";
DataContext db = new DataContext(connectionString);

var query = from u in db.GetTable<User>()
            group u by u.Age // группировка по возрасту
            into grouped
            select grouped;
// или так
// var query = db.GetTable<User>().GroupBy(u => u.Age);
foreach (var group in query)
{
    Console.WriteLine("Возраст: {0}",group.Key);
    foreach (var user in group)
        Console.WriteLine(user.FirstName);
    Console.WriteLine();
}

В результате выполнения выражения linq будет сформировано и выполнено следующее sql-выражение:

SELECT [t0].[Age] AS [Key]
FROM [Users] AS [t0]
GROUP BY [t0].[Age]

Пагинация

string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";
int pageNumber = 0; // текущая страница
int pageSize = 5; // кол-во элементов на странице
int count = 0; // сколько всего элементов

DataContext db = new DataContext(connectionString);

count = db.GetTable<User>().Count();
if(count>pageNumber*pageSize)
{
    var query = db.GetTable<User>().Skip(pageNumber * pageSize).Take(pageSize);
    foreach (var user in query)
    {
        Console.WriteLine("{0} \t{1} \t{2}", user.Id, user.FirstName, user.Age);
    }
}

Здесь сначала с помощью метода Count() получаем общее количество объектов в базе данных. Затем с помощью метода Skip() пропускаем нужное число элементов, а через метод Take() извлекаем нужную порцию объектов.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850