QueryOver和多个SubQueries的编译错误

时间:2014-10-15 11:44:52

标签: nhibernate queryover

当我使用带有子查询列表的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;

我需要以编程方式执行此操作,因为我正在动态生成子查询,并且不知道将有多少个子查询。我需要使用动态类型吗?

2 个答案:

答案 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();
    }

我现在可以以编程方式构建并有选择地应用子查询。