2011-04-13 31 views
2

使用新的API QueryOver在NHibernate的,我需要做一些事情當量:實施「其中不存在」與NHibernate QueryOver

換句話說:「給我一個不包含狗的所有類別餐飲」。

我最初的想法是這樣的:

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,但我在這裏和谷歌的搜索沒有任何用處。

回答

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(); 
} 
+0

「cp.CategoryID = c.Id」限制在哪裏?不應該在分離的查詢中有「Where(()=> categoryProductAlias.CategoryID = categoryAlias.ID)」嗎? – psousa 2011-04-14 08:12:38

3

我只是在同樣的問題上運行,以及可能的解決方案是:

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

它適用於我類似的標準。

+0

謝謝!這讓我開始工作! – Reaction21 2012-08-29 07:02:10

+0

無法在沒有投影的條件下使用子查詢。 它需要某種投影(即選擇子句) – 2016-04-07 06:09:33

+0

其實,有選擇。查看QueryOver.Of ... 定義投影。 – vllado2 2016-06-15 15:02:42