Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用NHibernate的QueryOver API在子查询中表示包含WHERE..的查询?_C#_Nhibernate_Queryover - Fatal编程技术网

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();