2009-07-27 102 views
3

更新需要2NHibernate的:左外连接上子查询

这里是两个查询我的工作(呼叫在这两个查询省略)

我想获得以下查询

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' 

如何管理创建第一种查询类型? 我希望我的问题是更清晰:)缺乏明确的是,有时我的一个大敌:对


更新:

FWIW,我还没有找到答案,我目前加载分页的产品数据和整个购物车以显示正确的对象。 原油解决方案,但它的工作原理,它击败了我一直试图让Criteria API认可我为其主人的组合。我会非常有兴趣,如果有人能发生点我在正确的方向,虽然;)


你好,

我有一个很难的标准API书面下面的查询,我真的不知道该怎么做:我希望有人能够提供帮助。

在数据库中,我有产品。这些产品可以在许多购物车中(每个用户一个购物车),并且每个购物车可以包含许多产品,所以我们有许多关系。 我想显示每个产品的列表以及旁边的小图标,以通知用户此特定产品已在购物车中。我所做的是,我向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类有趣。它只包含属性预测。

问题是,使用此查询,购物车过滤应用于整个结果集,并且我看不到每个产品都存在于用户的购物车中,而是看到用户购物车中的每个产品。

是否可以使用Nhibernate中的Criteria API在子查询上执行左外连接?有关信息,如果可能,我希望将其保留在Criteria API中。 谢谢

回答

6

我不知道我entirly跟随你的问题,但它听起来非常类似于我有一个问题。我觉得当你用NHibernate嵌套(子)criteira时,你会失去一些控制权。我能够解决我的问题,但我的表而不是使用嵌套的criteira别名。

可能试着...

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

,然后您上车滤光器将是一个OR条件

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

让我知道这是否可以帮助你...如果不是...也许发布SQL你上面的标准正在产生,它需要改变。

好运

+0

对不起托德,你是对的,也许我不是做足够的常识;)我编辑我的问题 – samy 2009-07-31 14:03:35