Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223

Динамическое формирование запроса

27.03.2018, 14:27. Показов 1892. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Получаю данные из БД запросом:

C#
1
2
3
4
5
6
7
8
9
10
      
using (var session = NHibernateHelper.OpenSession(Common.DBpath))
            {
                _parties = session.QueryOver<Party>()
 
                    .Fetch(a => a.Contract).Eager
                    .Fetch(a => a.DeliveryPlace).Eager
                    .Fetch(a => a.Route).Eager
                    .List();
            }
Есть ли способ динамически вызывать метод Fetch в таком запросе? Т.е. по разному перечню полей?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.03.2018, 14:27
Ответы с готовыми решениями:

Формирование T-SQL запроса
Добавление данных в бд, ошибка говорит о том, что неправильный запрос, помогите его сформировать пожалуйста, не могу понять что не так( ...

Формирование запроса, с сохранением в Excel файл
Как я поняла, то необходимо сделать запрос, который хранится в кнопке, при нажатии формируется отчет в exel файле... Суть задания...

Формирование Delete и Update запроса для tableAdapter
Добрый день! я формирую insert запрос для tableAdapter'ов(каждый адаптер связан со своей таблицей) таким вот образом: ...

4
Эксперт .NET
 Аватар для Usaga
14311 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,420
27.03.2018, 14:42
Лучший ответ Сообщение было отмечено wrq2017 как решение

Решение

Цитата Сообщение от wrq2017 Посмотреть сообщение
Есть ли способ динамически вызывать метод Fetch в таком запросе? Т.е. по разному перечню полей?
А вы сейчас не это делаете? Так-то вам session.QueryOver<Party>() явно возвращает некий интерфейс, у которого вы и вызываете Fetch. Вполне можно додуматься сохранить его в переменную и обращаться по выполнению условий.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using (var session = NHibernateHelper.OpenSession(Common.DBpath))
{
    var q = session.QueryOver<Party>(); 
 
    if (условие1) {
        q = q.Fetch(a => a.Contract).Eager;
    }
    if (условие2) {
        q = q.Fetch(a => a.DeliveryPlace).Eager;
    }
    if (условие3) {
        q = q.Fetch(a => a.Route).Eager
    }
    _parties = q.ToList();
}
1
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
27.03.2018, 14:49  [ТС]
Usaga, спасибо за комментарий. Однако вопрос был к созданию универсального метода. Т.е. я хочу передавать массив лямбда-выражений, описывающий конкретный набор полей некоторого класса как параметр метода.
0
Эксперт .NET
 Аватар для Usaga
14311 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,420
27.03.2018, 14:52
wrq2017, пример выше это и показывает.

Если вы под универсальностью понимается единообразная работа с любой сущностью, то спешу вас расстроить: так не выйдет. Но формировать (динамически) запрос с сущностью одного типа - пожалуйста. Паттерн называется "Спецификация". То, что реализуют EntityFramework и NHibernate - именно оно.
1
3 / 3 / 2
Регистрация: 30.07.2017
Сообщений: 223
27.03.2018, 15:08  [ТС]
Вот так работает:
C#
1
2
3
4
5
6
7
8
9
10
            List<T> _someEntity;
            using (var session = NHibernateHelper.OpenSession(Common.DBpath))
            {
                IQueryOver<T, T> qo = session.QueryOver<T>();
 
                IQueryOverFetchBuilder<T, T> fb1 = new IQueryOverFetchBuilder<T, T>(qo, Expr[0]);
                IQueryOverFetchBuilder<T, T> fb2 = new IQueryOverFetchBuilder<T, T>(qo, Expr[1]);
 
                _someEntity = fb1.Eager.List().ToList();
            }
Но надо как-то скрестить fb1 и fb2. Не могу понять как это сделать.

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
Если вы под универсальностью понимается единообразная работа с любой сущностью, то спешу вас расстроить: так не выйдет
Почему? И никакие костыли не помогут? Неужели все пишут кучу однотипных запросов к разным сущностям?

Добавлено через 10 минут
Usaga, кажется с Вашей помощью решение нашлось:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        public List<T> Test<T>(Expression<Func<T, object>>[] Expr) where T : class
        {
            List<T> _someEntity;
            using (var session = NHibernateHelper.OpenSession(Common.DBpath))
            {
                IQueryOver<T, T> qo = session.QueryOver<T>();
                for (int i = 0; i < Expr.Length; i++)
                {
                    qo = qo.Fetch(Expr[i]).Eager;
                }
                _someEntity = qo.List().ToList();
            }
            return _someEntity;
        }
Добавлено через 4 минуты
Спасибо! Проверил, работает!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.03.2018, 15:08
Помогаю со студенческими работами здесь

Формирование запроса Sql исходя из выбраных значений CheckedListbox'a
Собственно из названия темы все понятно,помогите пожалуйста ибо руки растут,но не откуда надоprivate void button1_Click_1(object sender,...

Формирование запроса к базе данных и сохранение в ней внесенных изменений
База данных Access 2003 Таблиц в базе в принципе, но вроде для запроса нужны 3 Таблица Polzovatel содержит id, номер группы,фамилию и ...

Динамическое формирование рисунков.
Народ! Подскажите как средствами ASP формировать динамические рисунки. Например: ...

Динамическое формирование разметки
Здраствуйте всем. Мне нужна помощь в ASP.NET. У меня DB где находиться определённое количество линий с текстом в один столбик. И я в...

Формирование Post запроса
Не получается сформировать куки в пост запросе. Вот код. string lang = &quot;ru&quot;; string _ga =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru