当我使用带有子查询列表的QueryOver时,我收到以下编译错误:
“无法根据用法推断方法'xxxx'的类型参数。请尝试明确指定类型参数。”
以下是代码,但不确定如何纠正它:
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;
我需要以编程方式执行此操作,因为我正在动态生成子查询,并且不知道将有多少个子查询。我需要使用动态类型吗?
答案 0 :(得分:0)
我认为你可以通过稍微改写一下来解决这个问题:
foreach (QueryOver subQuery in subQueries)
{
query.Where(
Restrictions.EqProperty(
Projections.Property<Customer>(c => c.CustomerID),
Projections.SubQuery(subQuery.DetachedCriteria)));
}
我不太了解您的子查询,但您可以使用List<QueryOver<Customer>>
代替。问题是.WithSubquery...In
需要QueryOver<U>
,其中您的列表是非通用基类型(QueryOver
)。
答案 1 :(得分:0)
我设法通过一点点重构来解决这个问题。安德鲁的回复让我想到了使用.Where()(而不是.WithSubquery),然后使用Conjunction进行子查询。重构的代码如下所示:
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();
}
我现在可以以编程方式构建并有选择地应用子查询。