Фильтрация и сортировка
Чтобы применить фильтрацию и сортировку в LINQ to SQL, мы можем воспользоваться стандартными операторами и выражениями LINQ. Например, выведем всех пользователей, у которых возраст больше 25 и упорядочим по имени:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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-выражение:
1 2 3 4 |
SELECT [t0].[Id], [t0].[Name] AS [FirstName], [t0].[Age] FROM [Users] AS [t0] WHERE [t0].[Age] > 25 ORDER BY [t0].[Name] |
Которое и возвратит все необходимые данные.
Группировка
Для группировки данных применяется оператор group by
или аналогичный метод GroupBy()
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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-выражение:
1 2 3 |
SELECT [t0].[Age] AS [Key] FROM [Users] AS [t0] GROUP BY [t0].[Age] |
Пагинация
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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()
извлекаем нужную порцию объектов.