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 ответ:
Я не уверен, что полностью понимаю вашу проблему, но это звучит очень похоже на проблему, которая у меня была. Мне кажется, что когда у вас есть вложенные (под) 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, что ваш критерии, приведенные выше, генерируют и там, где это необходимо изменить.
Удачи