【问题标题】:Implementing "where not exists" with NHibernate QueryOver使用 NHibernate QueryOver 实现“不存在的地方”
【发布时间】:2011-04-13 09:17:40
【问题描述】:

在 NHibernate 中使用新的 QueryOver 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&lt;T&gt;.Contains() 上出现“无法识别的方法调用”。

我认为一定有其他方法可以做到这一点,可能涉及ICriterion,但我在这里和谷歌上的搜索没有返回任何有用的结果。

【问题讨论】:

    标签: nhibernate queryover


    【解决方案1】:

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

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

    它适用于我的类似标准。

    【讨论】:

    • 不能在没有投影的条件上使用子查询。它需要某种投影(即选择子句)
    • 其实是有选择的。看 QueryOver.Of...Of 定义投影。
    【解决方案2】:

    未测试,但类似

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

    【讨论】:

    • “cp.CategoryID = c.Id”限制在哪里?分离查询中不应该有“Where(() => categoryProductAlias.CategoryID = categoryAlias.ID)”吗?
    猜你喜欢
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    相关资源
    最近更新 更多