IN运算符在NHibernate上使用Linq的地方

时间:2012-07-17 14:11:57

标签: c# linq nhibernate queryover

我使用Session.Query<T>方法对NHibernate进行了linq查询,我在此查询中获取了一些复杂的属性和集合属性。我想知道,如何使用IN中的int[]运算符添加条件?看看我的代码:

public IEnumerable<Product> GetProducts(int[] idCategories) 
{
    // how to add IN condition here or a subquery 
    var query = Session.Query<Product>()
                   .Where(?????)
                   .Fetch(x=>x.Category)
                   .FetchMany(x=>x.Status).ThenFetch(x=>x.Item);

    return query.ToList();
}

我有另一个方法来执行查询以获取此int[],我想在此处应用它,或者如果有任何方法在IN运算符上添加此子查询,我真的很感激!

OBS:如果必要,我可以将int[]转换为List<int>

编辑

我通过以下查询获得此int[]

return session.Query<Category>.Where(...).Select(x => x.Id).ToArray();

我的第二个问题是,如何将此查询作为子查询添加到按类别过滤?

谢谢!

3 个答案:

答案 0 :(得分:7)

您真的不需要IN运算符。你可以这样做:

.Where(x => idCategories.Contains(x.Category))

注意:Contains是一种扩展方法。您需要确保拥有System.Linq的using语句,但您可能已经拥有它。

答案 1 :(得分:2)

查看限制,例如

var query = Session.Query<Product>()
     .Where(Restrictions.In(Projections.Property<Product>x=>x.Id),idCategories))
     .Fetch(x=>x.Category)
     .FetchMany(x=>x.Status).ThenFetch(x=>x.Item);

答案 2 :(得分:1)

关于子查询,您需要子查询类

var query = Session.Query<Product>()
               .Where(Subqueries.WhereProperty<Product>(x=>x.Id)...)
               .Fetch(x=>x.Category)
               .FetchMany(x=>x.Status).ThenFetch(x=>x.Item);

有关详细信息,请查看此处How to do subqueries in nhibernate?