1

たとえば、コード内で相互に参照されていない2つのテーブルに対してクエリを実行する方法を理解するのは非常に困難です。

Customer -> Product* where customer and product have reference to each other

および在庫->製品*(製品が在庫を参照していない場合)

製品を在庫に持っていないすべての顧客を見つけたいと思います。

私はこれまでにこれを行いました

var subQueryInv= DetachedCriteria.For<Inventory>();
        subQueryInv
            .Add(Restrictions.IsNotNull("Product.Id"))
            .SetProjection(Projections.Property<Inventory>(inv=> inv.Product.Id));

        var subQueryProd = DetachedCriteria.For<Product>();
        subQueryTire
            .Add(Subqueries.PropertyNotIn("Id", subQueryInv))
            .SetProjection(Projections.Property<Tire>(prod=> prod.Customer.Id));

        var subQueryCust= DetachedCriteria.For<Customer>();
        subQueryCust
            .Add(Subqueries.PropertyIn("Id", subQueryProd))
            .SetProjection(Projections.Property<TireSet>(cust => cust.Id));

それは機能しますが、クエリは非常に非効率的であり、Inventory部分に対してこのようなSQLを生成しています... WHERE Product.Id NOT IN(SELECT Inventory.ProductId FROM Inventory WHERE Inventory.ProductId IS NOT NULL)

したがって、製品レコードごとに、Inventoryテーブル全体をクエリしています。次のように、サブクエリに親IDへの参照を含めるにはどうすればよいですか。

    ...WHERE Product.Id NOT IN (SELECT Inventory.ProductId FROM Inventory WHERE Inventory.ProductId IS NOT NULL AND Inventory.ProductId = Product.Id)

4

1 に答える 1

2

エイリアスを使用して主な基準を参照できます

var subQueryInv= DetachedCriteria.For<Inventory>();
    .Add(Restrictions.IsNotNull("Product.Id"))
    .Add(Restrictions.PropertyEq("Product", "product"))
    .SetProjection(Projections.Property<Inventory>(inv => inv.Product.Id));

var subQueryProd = DetachedCriteria.For<Product>("product");
于 2012-08-14T05:39:00.730 に答える