C# 如何使用NHibernate的QueryOver API在子查询中表示包含WHERE..的查询?
我有一个对象模型,其中订单包含许多行项目,每个行项目都有一个关联的产品。在对象模型中,这些是单向关联-行项目对其顺序一无所知 我想查询包含商品名称与字符串匹配的行项目的订单,为每个订单返回一行,以便可以执行分页C# 如何使用NHibernate的QueryOver API在子查询中表示包含WHERE..的查询?,c#,nhibernate,queryover,C#,Nhibernate,Queryover,我有一个对象模型,其中订单包含许多行项目,每个行项目都有一个关联的产品。在对象模型中,这些是单向关联-行项目对其顺序一无所知 我想查询包含商品名称与字符串匹配的行项目的订单,为每个订单返回一行,以便可以执行分页 SELECT * FROM Orders WHERE OrderID IN ( SELECT DISTINCT OrderID FROM LineItems INNER JOIN Products on LineItems.ProductID = Produ
SELECT * FROM Orders
WHERE OrderID IN (
SELECT DISTINCT OrderID
FROM LineItems
INNER JOIN Products on LineItems.ProductID = Products.ProductID
WHERE Products.Name = 'foo'
)
假设我有一个ICriteria或IQueryOver来表示子查询,那么如何将它实际应用于我的根订单查询
var subquery = QueryOver.Of<LineItem>
.Where(l => l.Product.Name == "foo")
.TransformUsing(Transformers.DistinctRootEntity);
我发现很多例子都假设查询中的根对象位于一对多关系的多个方面,但我不知道如何对根对象具有多个方面的内容添加限制。使用此选项可以实现您提供的SQL的直接翻译
var subQuery =
QueryOver.Of<LineItem>(() => lineItem)
.JoinAlias(() => lineItem.Products, () => product)
.Where(() => product.Name == "foo")
.Select(Projections.Distinct(
Projections.Property(()=> lineItem.Order.Id)));;
var theQueryYouNeed =
QueryOver.Of<Orders>(() => order)
.WithSubquery.WherePropertyIn(() => order.Id).In(subQuery);
我会在订单和行项目之间建立双向关系,以允许高效的查询减少所需的连接数量。但是,如果出于某种奇怪的原因您不能,那么您需要从订单开始子查询
LineItem lineItemAlias = null;
Product productAlias = null;
var subQuery = QueryOver.Of<Order>()
.JoinAlias(x => x.LineItems, () => lineItemAlias)
.JoinAlias(() => lineItemAlias.Product, () => productAlias)
.Where(() => productAlias.Name == "foo")
.Select(Projections.Group<Order>(x => x.Id));
var results = Session.QueryOver<Order>()
.WithSubquery.WhereProperty(x => x.Id).In(subQuery)
.List();
如果LineItem没有Order属性,请尝试使用WithSubquery.WherePropertyI。那么您是如何在示例SQL中投影出OrderId的呢?您可能需要在子查询上正确添加限制,因为我不知道关系名称LineItem的确切位置。。您会得到一般的想法问题是我的LineItems没有Order属性,因此无法在子查询中表示我想要OrderID。我可以混合使用QueryOver和ICriteria吗?我写的QueryOver是通过查看您发布的SQL。。其中是在示例中的内部SQL中的哪个实体上定义的OrderId“LineItems”数据库表具有OrderId列,但LineItem类没有Order或OrderId属性。第二个查询是否有帮助?
LineItem lineItemAlias = null;
Product productAlias = null;
var subQuery = QueryOver.Of<Order>()
.JoinAlias(x => x.LineItems, () => lineItemAlias)
.JoinAlias(() => lineItemAlias.Product, () => productAlias)
.Where(() => productAlias.Name == "foo")
.Select(Projections.Group<Order>(x => x.Id));
var results = Session.QueryOver<Order>()
.WithSubquery.WhereProperty(x => x.Id).In(subQuery)
.List();