我想在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;制作扩展程序。对象和链接连接,但这需要一个静态方法,这意味着我不能使用IdPicker
或Session
对象。
我最终在此期间使用dynamic
关键字作为解决方案(dynamic[] others
),但据我了解,它应该仅作为最后的手段使用。
所以,问题是,还有另一种解决方法吗?