2

QueryOverNHibernateの新しい API を使用して、次のようなことを行う必要があります。

select c.*
from Category c
where not exists (
    select *
    from CategoryProduct cp
    where cp.CategoryID = c.Id
    and cp.ProductID = 'DogFood'
)

つまり、「ドッグフードを含まないすべてのカテゴリを教えてください」です。

私の最初の考えは次のようなものでした:

IEnumerable<Category> FindCategoriesWithoutProduct(Product product)
{
    return _session
        .QueryOver<Category>()
        .Where(c => c.Products.Contains(product))
        .List();
}

ただし、これによりNHibernate.Impl.ExpressionProcessor、「認識されないメソッド呼び出し」が発生して爆発しSystem.Collections.Generic.ICollection<T>.Contains()ます。

これを行うには、おそらくICriterion.

4

2 に答える 2

4

私はちょうど同じ問題で実行しています。可能な解決策は次のとおりです。

Category aliasCategory = null;
CategoryProduct aliasCategoryProduct = null;

var qcp = QueryOver.Of<CategoryProduct>(() => aliasCategoryProduct)
          .Where(() => aliasCategoryProduct.ProductID == "DogFood")
          .Where(() => aliasCategory.Id == aliasCategoryProduct.CategoryID)
          .DetachedCriteria;

return _session.QueryOver<Category>(() => aliasCategory)
               .Where(Subqueries.NotExists(qcp));

それは私の同様の基準で機能します。

于 2011-04-14T12:16:16.257 に答える
3

テストされていませんが、このようなもの

IEnumerable<Category> FindCategoriesWithoutProduct(Product product)
{
    CategoryProduct categoryProductAlias = null;
    var subQuery = QueryOver.Of<CategoryProduct>(() => categoryProductAlias)   
        .Select(x => categryProductAlias.ID)
        .Where(() => categoryProductAlias.ProductID == "DogFood");

    Category categoryAlias = null;
    return _session
        .QueryOver<Category>(() => categoryAlias)
        .WithSubquery.WhereProperty(() => clientAlias.Id).NotIn(subQuery)
        .List();
}
于 2011-04-13T10:03:07.280 に答える