NHibernate中的协变QueryOver集合

时间:2018-05-28 09:15:32

标签: c# generics dynamic nhibernate queryover

我想在NHibernate中加入几个由相同ID相关的查询,并使用一个获取主查询并通过子查询加入的方法。即:

public IqueryOver<T, T> Join(QueryOver<T, T> main, params QueryOver[] others)
{
    var result = main.GetExecutableQueryOver(Session);

    foreach(var subQuery in others)
         result = result.WithSubQuery.WhereProperty(IdPicker).In(subQuery);

    return result;
}

其中IdPicker是一个lambda,它根据存储库选择适当的属性。

现在,所有这些都运行良好,并生成如下SQL:

SELECT ...
FROM <TABLE> this_
WHERE ...
AND this_.ID in (<subquery>)

问题是,others是不同模型的QueryOver数组,并且无法自动推断类型参数。 我尝试通过使所有这些模型实现一个公共接口来解决这个问题,所以现在方法得到如下参数:

params QueryOver<IAnimal, IAnimal>[] others

但是仍然没有解决它,因为我收到了错误cannot convert from QueryOver< Dog, Dog> to QueryOver< IAnimal, IAnimal>。 当然,Dog实现了IAnimal,但是存在协方差问题。

作为Medo42 suggests,如果我有权访问QueryOver类层次结构,我可以从另一个类派生它,但我没有。

我知道我可以让方法一次只接受一个参数,然后为每个子查询调用它,但我想避免这种情况并使其更通用。我考虑的另一个解决方案是为QueryOver&lt;,&gt;制作扩展程序。对象和链接连接,但这需要一个静态方法,这意味着我不能使用IdPickerSession对象。

我最终在此期间使用dynamic关键字作为解决方案(dynamic[] others),但据我了解,它应该仅作为最后的手段使用。

所以,问题是,还有另一种解决方法吗?

0 个答案:

没有答案