Построить запрос NHibernate, упорядочивающий по логическому условию - PullRequest
1 голос
/ 09 декабря 2011

У меня есть две сущности: Client и AccountPlan, которые имеют отношение от 1 до 0..1. Я хотел бы получить своих клиентов, заказанных сначала клиентами, у которых есть AccountPlan, а затем клиентами, у которых их нет. Когда я пытаюсь выполнить следующий запрос Linq to Nhibernate:

        return NHibernateSession.Current.Query<Client>()
            .Where(x => x.SalesRepId == id)
            .OrderBy(x => x.AccountPlan == null);

Я получаю исключение QuerySyntaxException со следующим сообщением:

{"Исключение типа 'Antlr.Runtime.NoViableAltException' было сгенерировано. [.OrderBy (.гд (NHibernate.Linq.NhQueryable`1 [FIS.AccountManagement.Core.Domain.Client], Цитировать ((x,) => (Равен (x.SalesRepId, p1))),), Цитировать ((x,) => (Равен (x.AccountPlan,))),)] "}

Вот соотношение между двумя объектами, если это важно:

    public ClientMap()
    {
        HasOne(x => x.AccountPlan).PropertyRef(r => r.Client);
    }


    public AccountPlanMap()
    {
        DynamicInsert();

        References(x => x.Client, "EntityID");
    }

Кто-нибудь знает запрос от одного из множества API-интерфейсов NHibernate, который выполнит то, что я хочу? Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 19 сентября 2013

Использование условного оператора:

return NHibernateSession.Current.Query<Client>()
    .Where(x => x.SalesRepId == id)
    .OrderBy(x => x.AccountPlan == null ? 1 : 0);
1 голос
/ 09 декабря 2011

два запроса в одном направлении, объединенные вместе

var clientsWithPlan = NHibernateSession.Current.Query<Client>()
    .Where(x => x.SalesRepId == id)
    .Where(x => x.AccountPlan != null)
    .Future();

var clientsWithoutPlan = NHibernateSession.Current.Query<Client>()
    .Where(x => x.SalesRepId == id)
    .Where(x => x.AccountPlan == null)
    .Future();

return clientsWithPlan.Concat(clientsWithoutPlan);
0 голосов
/ 09 декабря 2011

В качестве обходного пути вы можете извлечь всех клиентов из неупорядоченной базы данных, а затем выполнить упорядочение в приложении, используя LINQ для объектов:

var clients = NHibernateSession.Current.QueryOver<Client>()
    .Where(x => x.SalesRepId == id)
    .Fetch(x => x.Account).Eager
    .List();

return clients.OrderBy(x => x.AccountPlan == null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...