Nhibernate: левое внешнее соединение на подзапросе


Обновление take 2

Вот два запроса, с которыми я работаю (подкачка опущена в обоих запросах)

Я хотел бы получить следующий запрос

SELECT * 
FROM product
LEFT OUTER JOIN 
(
    SELECT * 
    FROM Cart 
    LEFT OUTER JOIN 
    cartproducts 
    ON Cart.Id = cartproducts.Cart_id 
    WHERE Cart.username = 'user'
)
AS CartFiltered 
ON product.Id = CartFiltered.product_id

Но мне всегда кажется, что я получаю

SELECT * 
FROM product  
LEFT OUTER JOIN 
cartproducts 
ON product.Id = cartproducts.Product_id 
LEFT OUTER JOIN
Cart
ON
cartproducts.cart_id = cart.id
WHERE Cart.username = 'user'

Как мне создать запрос первого типа? Я надеюсь, что мой вопрос яснее :) отсутствие ясности иногда является моим большим врагом: p


Обновление:

FWIW, я все еще не нашел ответа, и в настоящее время загружаю подкачанный продукт данные и вся тележка для отображения правильного объекта. Грубое решение, но оно работает, и оно превосходит комбинаторики, через которые я прошел, пытаясь заставить API критериев признать меня своим хозяином. Я был бы очень заинтересован, если бы кто-нибудь случайно указал мне правильное направление;)


Привет,

Мне трудно написать следующий запрос в API критериев, и я действительно не вижу, как это сделать: я надеюсь, что некоторые люди могут помочь.

В базе данных, i есть продукты. Продукты тезисов могут находиться во многих тележках (одна тележка на пользователя), и каждая тележка может содержать много продуктов, поэтому у нас есть множество отношений. Я хотел бы отобразить список каждого продукта, а также небольшую иконку рядом с ним, чтобы сообщить пользователю, что этот конкретный продукт уже находится в корзине. То, что я сделал, я попросил NHibernate для моих продуктов, и сделать левое внешнее соединение на тележках, фильтрованных владельцем тележки.

Dim critPage As ICriteria = Session.CreateCriteria(GetType(Product)) _
.SetFirstResult(pageNumber * itemsPerPage).SetMaxResults(itemsPerPage) _
.CreateCriteria("Carts", "c", SqlCommand.JoinType.LeftOuterJoin) _
.SetProjection(plist) _ 
.SetResultTransformer(New TypedResultTransformer(Of ProductWithCartInfo)) _
.Add(Expression.Eq("c.User", username))

список проекций здесь, чтобы уменьшить число столбцов к тому, что интересно для класса ProductWithCartInfo. Он содержит только проекции свойств.

Проблема в том, что при этом запросе фильтрация корзины применяется ко всему результирующему набору, и я вижу не каждый продукт с его присутствием в корзине пользователя, а скорее каждый продукт в корзине пользователя.

Можно ли выполнить левое внешнее соединение для подзапроса с помощью API критериев в Nhibernate? Для информации, я хотел бы сохранить его в API критериев, если возможный. Спасибо

1 4

1 ответ:

Я не уверен, что полностью понимаю вашу проблему, но это звучит очень похоже на проблему, которая у меня была. Мне кажется, что когда у вас есть вложенные (под) criteira с NHibernate вы теряете часть контроля. Я смог обойти свою проблему, но сглаживание таблиц вместо использования вложенных criteira.

Возможно, попробуем...

criteria.CreateAlias("Cart", "Cart", JoinType.LeftOuterJoin);

И тогда ваш фильтр на тележке должен быть условием или

ICriterion cartCriterion = Restrictions.Eq("Cart.User", username);
customerCriterion = Restrictions.Or(customerCriterion, Restrictions.IsNull("Cart.User"));
criteria.Add(customerCriterion);

Дайте мне знать, если это помогает вам... если нет... может быть, разместить SQL, что ваш критерии, приведенные выше, генерируют и там, где это необходимо изменить.

Удачи