nhibernate - 使用 NHibernate QueryOver 实现 "where not exists"

标签 nhibernate queryover

使用新的 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.ExpressionProcessorSystem.Collections.Generic.ICollection<T>.Contains() 上用“无法识别的方法调用”炸毁.

我假设一定有其他方法可以做到这一点,可能涉及 ICriterion ,但我在此处和 Google 上的搜索没有返回任何有用信息。

最佳答案

我刚遇到同样的问题,可能的解决方案是:

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

它符合我的类似标准。

关于nhibernate - 使用 NHibernate QueryOver 实现 "where not exists",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5646947/

相关文章:

使用 Web 服务的 NHibernate 父/子孤立记录

c# - 模拟 NHibernate IQueryOverOrderBuilder 对象

c# - 对非相关实体进行复杂连接的 nhibernate queryover

nhibernate - QueryOver by join and add conditions by Independent if

c# - 如何使用 nhibernate 选择字典值中的列?

asp.net-mvc - 尝试根据 Web 请求实现 session ,没有配置当前 session 上下文

c# - Fluent NHibernate 自动映射基类覆盖

nhibernate - 如何在 NHibernate 中添加 SaveOrUpdateCopy 事件监听器

c# - 复合键不尝试保留键值

c# - nhibernate 投影到匿名类型