![]() |
|
Модераторы: gambit |
![]()
|
|
| PavelVik |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 12.5.2008 Репутация: нет Всего: нет |
Здравствуйте!
У меня возникла проблема - как отсортировать записи, которые подгружаются из БД через навигационные свойства? Есть вот такая БД и связанная с ней модель, в которой имеет место быть отношение Много-ко-Многим: ![]() Если мне нужны все записи из основной таблицы, порядок сортировки можно указать в запросе:
Для подгрузки связанных данных использую такой код:
Вопрос в том, как отсортировать эти подгруженные связанные данные? |
||||
|
|||||
| PavelVik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 12.5.2008 Репутация: нет Всего: нет |
Итак, сам спросил, сам отвечу.
Получилось решить задачу вот так:
Но теперь другой вопрос - а как сделать сортировку по двум полям? Т.е. допустим у меня есть таблица с полями Name и Order, в программе я выбираю сортировку по полю Order. Как сделать так, чтобы внутри каждого Order выполнялась еще сортировка по полю Name? |
|||
|
||||
| KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 5 Всего: 38 |
Думаю по аналогии с l2s должно быть:
-------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
| PavelVik |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 12.5.2008 Репутация: нет Всего: нет |
Да, действительно, вроде разобрался.
Ответ:
Но теперь новый вопрос появился - а как передавать значение в OrderBy(p => p.cp_box)? В программе предусматривается динамическая сортировка, порядок выбирает пользователь. Что такое "p => p.cp_box" и как это значение подсунуть в запрос? Неужели писать что-то типа:
|
||||
|
|||||
| KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 5 Всего: 38 |
Лямбда выражение, в данном случае значит, что каждый элемент p будет отсортирован по полю cp_box. Как то так:
cp_box0, cp_box1, cp_box2 - твои поля для сортировки. -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
| PavelVik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 12.5.2008 Репутация: нет Всего: нет |
Почему-то так не получается. Мой код:
Ошибка: 'System.Linq.IQueryable<components.component>' does not contain a definition for 'ThenBy' and no extension method 'ThenBy' accepting a first argument of type 'System.Linq.IQueryable<components.component>'. |
|||
|
||||
| PavelVik |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 12.5.2008 Репутация: нет Всего: нет |
Вроде получилось заставить это работать как мне хотелось.
Ниже приведу код, на случай если кому-то понадобится. Правда, до конца я так и не понял почему оно работает только в таком виде.. Загрузка данных с сортировкой по двум столбцам (причем, при сортировке по дате, первыми идут более новые):
А это сортировка при подгрузке связанных данных:
|
||||
|
|||||
| KelTron |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 5 Всего: 38 |
На счёт первого, да, видать не получится ThenBy отделить от OrderBy. Дело в том, что ThenBy работает только на IOrderedEnumerable последовательности, которая получается после OrderBy, и компилятору неизвестно, что в свиче такая последовательность может быть получена.
Во втором примере полагаю вместо label должно быть items. Тогда лучше сократить код: var items = Context.componentSet.components.CreateSourceQuery().AsQueryable();
В обоих примерах незачем создавать временный список, можно сразу вернуть результат: Вместо:
Сделать:
Context.Dispose() будет вызван в любом случае, т.к. using разворачивается в try{}finally{}. -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
||||||
|
|||||||
| PavelVik |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 12.5.2008 Репутация: нет Всего: нет |
Я снова вернулся со своими вопросами
На этот раз меня интересует, как узнать количество записей в таблице, связанной отношением many-many без загрузки содержимого? Просто для отдельной таблицы я могу использовать следующий код:
Но что делать, если мне нужно узнать сколько записей в связанной таблице? Сейчас я делаю так:
Но в этом случае сначала подгружаются данные, а уже потом происходит подсчет. Что весьма ресурсоемко в случае большого количества записей. Как обойти данную проблему? |
||||
|
|||||
| KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 5 Всего: 38 |
Может так, код не проверял, нету под рукой такой бд)
-------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
| PavelVik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 26 Регистрация: 12.5.2008 Репутация: нет Всего: нет |
KelTron, спасибо в очередной раз за помощь!
А не подскажешь, как можно увидеть SQL-запрос, который сформировала модель? Чтобы оценить эффективность. |
|||
|
||||
| KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 5 Всего: 38 |
Самое простое вывести в консоль:
Но можно в лог подсунуть любой TextWriter. А вообще поищи по словам datacontext logging, кучу ссылок выдаёт. Это всё конечно для l2s, для entity framework может отличаться. -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Базы данных под .NET | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |