Nhibernate:子查询上的左外部联接

Nhibernate:子查询上的左外部联接,nhibernate,subquery,left-join,Nhibernate,Subquery,Left Join,更新拍摄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 prod

更新拍摄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承认我是它的主人。不过,如果有人能为我指出正确的方向,我会非常感兴趣;)


你好,

我很难在CriteriaAPI中编写以下查询,但我真的不知道怎么做:我希望有人能帮我

在数据库上,我有产品。这些产品可以在多个购物车中(每个用户一个购物车),每个购物车可以包含多个产品,因此我们有很多关系。 我想显示每个产品的列表,并在其旁边显示一个小图标,以通知用户此特定产品已在购物车中。我所做的是,我要求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中的CriteriaAPI对子查询执行左外部联接?作为参考,如果可能的话,我想把它保存在CriteriaAPI中。
谢谢

我不确定我是否完全关注你的问题,但它听起来与我的问题非常相似。我似乎认为,当您使用NHibernate的嵌套(子)标准时,您会失去一些控制。我能够绕过我的问题,但我的表别名,而不是使用嵌套的标准

可能试试

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,以及需要更改的地方


祝你好运

对不起,托德,你说得对,也许我说得不够清楚;)我正在编辑我的问题,我终于有时间测试你的解决方案了,效果很好。我必须正确地实现它,也许还要为分页添加一个子查询,但除此之外,谢谢!