Nhibernate 查询版本和多个子查询的编译错误

Nhibernate 查询版本和多个子查询的编译错误,nhibernate,queryover,Nhibernate,Queryover,当我将QueryOver与子查询列表一起使用时,出现以下编译错误: “无法从用法推断方法‘xxxx’的类型参数。请尝试显式指定类型参数。” 以下是代码,但不确定如何更正: List<QueryOver> subQueries = new List<QueryOver>(); subQueries.Add(QueryOver.Of<Customer>().Where(...)); subQueries.Add(QueryOver.Of&l

当我将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;
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()和子查询返回一个值列表。我试图将其切换到限制。在中,这是实际值,而不是子查询。最后我用一个连词()来解。