NHibernate QueryOver - Делает выборки и OrderBy -> Какой синтаксис использовать? - PullRequest
1 голос
/ 03 апреля 2019

All

У меня есть запрос как таковой:

_AddOrderBy(sortOptions, query)
                .Fetch(x => x.ImageType).Eager
                .Fetch(x => x.User).Eager
                .Fetch(x => x.Partner).Eager
                .Inner.JoinAlias(x => x.Partner, () => p).Fetch(x => x.Company).Eager

                .Skip(startIndex)
                .Take(pageSize)
                .List<ImageRequest>();

В приведенном выше QueryOver я вызываю метод _AddOrderBy (), который добавляет предложение order by. Сложность, с которой я сталкиваюсь, заключается в том, как создать «заказ по», который ссылается на свойство (упорядочение по «CompanyName»), которое находится в пределах следующего пути ассоциации, не конфликтуя с моими объединениями Fetch () / Inner:

ImageRequest.Partner.Company.CompanyName

Внутри моего _AddOrderBy () у меня есть это:

Partner p = null;
            Company comp = null;
            order = query.Inner.JoinAlias(x => x.Partner, () => p)
                .Inner.JoinAlias(x => x.Company, () => comp)
                .OrderBy(x => comp.CompanyName);

Но это дает мне исключение во время выполнения о том, что в критериях у меня есть дубликат ключа (имеется в виду Партнер). Я вижу, что это противоречит моей страстной желанию. Мои вопросы:

Как добавить «заказ по», чтобы он работал с моей выборкой.

1 Ответ

1 голос
/ 03 апреля 2019

Прелесть использования псевдонима в QueryOver заключается в том, что вам не нужно снова использовать Fetch или JoinAlias в вашем методе _AddOrderBy(), если Join уже произошло в запросе.Вам нужно только объявить псевдоним с тем же именем.

Поэтому ваш _AddOrderBy() может выглядеть так:

Partner p = null;
Company comp = null;
order = query
    .Inner.JoinAlias(x => p.Company, () => comp) // you can use p here if it was used in the query before
    .OrderBy(x => comp.CompanyName);

Причина, по которой это работает, такова: если вы поставили целоекод в один метод, это будет очевидно работать.Разделение его на два метода все еще работает, потому что Partner p - это не ссылка на объект в памяти, а Alias, который просто переводится в строку для SQL-запроса.

...