我使用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();
我的第二个问题是,如何将此查询作为子查询添加到按类别过滤?
谢谢!
答案 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?