Присоединиться к подзапросу с NHibernate - PullRequest
2 голосов
/ 21 июня 2011

Можно ли выполнить следующий запрос в Criteria или QueryOver (NHibernate 3.1)?

SELECT
 C.CustomerID, C.CustomerName,
 C.CustomerType, C.Address1, C.City,
 C.State, S.TotalSales
FROM
 Customers C
INNER JOIN
 (SELECT
    CustomerID, SUM(Sales) as TotalSales
  FROM
    Sales
  GROUP BY
    CustomerID) S
ON
 C.CustomerID = S.CustomerID

Был похожий вопрос, но он довольно старый и не получил ответа.Может быть, с недавними серьезными обновлениями от команды NH на это можно ответить! NHibernate 2.1: СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ на подзапросе с псевдонимом (ICriteria)

Спасибо

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Если в модели объекта нет связи между клиентом и продажами, вы не можете соединить два объекта вместе, используя любые методы запросов в NH2.1, о которых я могу подумать.

Также вы не можете присоединиться к подзапросам несвязанных сущностей, как в вашем примере.

Однако вы можете сделать это в NH2.1, что даст вам аналогичные результаты.

var customers = session.CreateCriteria<Customer>().Future<Customer>() //Get all Customers
var salesTotals = session.CreateCriteria<Sales>()
     .SetProjection(Projections.ProjectionList()
        .Add(Projections.Property("CustomerId"), "CustomerID")
        .Add(Projections.Sum("Sales"),"SalesTotal")
      )
   .SetResultTransformer(
        new AliasToBeanResultTransformer(typeof(SalesByCustomerDTO))
   ).Future<SalesByCustomerDTO>().List()

Это выполнит одну поездку на сервер и выдаст два запроса: один для всех клиентов и один для совокупного объема продаж с customerid.

Затем вы можете объединить два набора результатов в памяти, используя LINQ.

0 голосов
/ 21 июня 2011

Мои 50 центов -> Вам необходимо изменить модель объекта. Так что клиент содержит продажи.

Ваш запрос выглядит тогда следующим образом, который гораздо более краткий и лучше ориентирован на объект. Я не знаю, как сделать запрос выше, хотя, но это противоречит цели использования инструмента ORM.

from Customer c
inner join fetch c.Sales
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...