Nhibernate 查询版本和多个子查询的编译错误
当我将QueryOver与子查询列表一起使用时,出现以下编译错误: “无法从用法推断方法‘xxxx’的类型参数。请尝试显式指定类型参数。” 以下是代码,但不确定如何更正:Nhibernate 查询版本和多个子查询的编译错误,nhibernate,queryover,Nhibernate,Queryover,当我将QueryOver与子查询列表一起使用时,出现以下编译错误: “无法从用法推断方法‘xxxx’的类型参数。请尝试显式指定类型参数。” 以下是代码,但不确定如何更正: List<QueryOver> subQueries = new List<QueryOver>(); subQueries.Add(QueryOver.Of<Customer>().Where(...)); subQueries.Add(QueryOver.Of&l
List<QueryOver> subQueries = new List<QueryOver>();
subQueries.Add(QueryOver.Of<Customer>().Where(...));
subQueries.Add(QueryOver.Of<Address>().Where(...));
subQueries.Add(QueryOver.Of<Account>().Where(...));
var query = session.QueryOver<Customer>();
foreach (QueryOver subQuery in subQueries)
{
query.WithSubquery.WhereProperty(c => c.CustomerID)
.In(subQuery); // this is throwing the compilation error
}
var result = query.Select(Projections.RowCount())
.FutureValue<int>()
.Value;
List子查询=新建列表();
Add(QueryOver.Of(),其中(…);
Add(QueryOver.Of(),其中(…);
Add(QueryOver.Of(),其中(…);
var query=session.QueryOver();
foreach(子查询中的查询覆盖子查询)
{
query.WithSubquery.WhereProperty(c=>c.CustomerID)
.In(子查询);//这将引发编译错误
}
var result=query.Select(Projections.RowCount())
.未来价值()
价值
我需要通过编程来实现这一点,因为我正在动态生成子查询,不知道会有多少子查询。我需要使用动态类型还是什么?我想你可以稍微重写一下:
foreach (QueryOver subQuery in subQueries)
{
query.Where(
Restrictions.EqProperty(
Projections.Property<Customer>(c => c.CustomerID),
Projections.SubQuery(subQuery.DetachedCriteria)));
}
foreach(子查询中的查询覆盖子查询)
{
查询,在哪里(
限制。设备属性(
Projections.Property(c=>c.CustomerID),
Projections.SubQuery(SubQuery.DetachedCriteria));
}
我对您的子查询了解不多,因此不必多说,但您可以使用
列表来代替。问题是。使用subquery…In
需要一个QueryOver
,其中您的列表是非泛型基类型(QueryOver
)。我通过一些重构成功地解决了这个问题。Andrew的回答让我想到使用.Where()(而不是.WithSubquery),然后在子查询中使用连词。重构后的代码如下所示:
Conjunction conj = new Conjunction();
conj.Add(Subqueries.WhereProperty<Customer>(x => x.CustomerID).In(QueryOver.Of<Customer>()...));
conj.Add(Subqueries.WhereProperty<Customer>(x => x.CustomerID).In(QueryOver.Of<AttributeValue>()...));
conj.Add(Subqueries.WhereProperty<Customer>(x => x.CustomerID).In(QueryOver.Of<CustomerListEntry>()...));
ISession session = sf.OpenSession();
using (var tran = session.BeginTransaction())
{
var query = session.QueryOver<Customer>()
.Where(conj)
.Select(Projections.RowCount())
.FutureValue<int>()
.Value;
tran.Commit();
}
Conjunction conj=新连接();
Add(subquerys.WhereProperty(x=>x.CustomerID).In(QueryOver.Of()…);
Add(subquerys.WhereProperty(x=>x.CustomerID).In(QueryOver.Of()…);
Add(subquerys.WhereProperty(x=>x.CustomerID).In(QueryOver.Of()…);
ISession session=sf.OpenSession();
使用(var-tran=session.BeginTransaction())
{
var query=session.QueryOver()
.Where(conj)
.Select(Projections.RowCount())
.未来价值()
价值
trans.Commit();
}
我现在可以通过编程建立并有选择地应用子查询。谢谢Andrew-虽然不太管用,但它确实给了我解决问题的想法!由于限制,Itt无法工作。EqProperty()和子查询返回一个值列表。我试图将其切换到限制。在中,这是实际值,而不是子查询。最后我用一个连词()来解。