2011-04-13 66 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