使用新的QueryOver
NHibernate 中的 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
,但我在这里和谷歌上的搜索没有返回任何有用的信息。
我只是遇到同样的问题,可能的解决方案是:
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));
它符合我类似的标准。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)