1

现在我正在使用 Criteria API 并喜欢它,但如果我可以切换到 QueryOver API 会更好。但是,我的设置有点奇怪。为了将数据分区到表中,我有一个基本抽象类:

Listing

以及从中继承的许多类:

Listing_UK
Listing_US
etc.

使用标准 API,我可以执行以下操作:

Type t = typeof(Listing_UK);
if (condition) t = typeof(Listing_US);
DbSession.CreateCriteria(t)
            .Add(Restriction.Eq("field",value)
            .List<Listing>());

基本上,对不同的类使用相同的查询。似乎 QueryOver 的强类型特性阻止了我这样做 - 基本问题是:

DBSession.QueryOver<Listing_UK>()

不投射到

DBSession.QueryOver<Listing>

虽然我理解为什么,但我想知道是否有人可以使用任何技巧来创建仍将针对正确表的通用 QueryOver?

4

2 回答 2

2

您可能会发现可以使用以下重载:

DbSession.CreateCriteria(myDynamicallyDeterminedType)
    .Add(Restrictions.On<Listing>(l => l.field == value))
    .List<Listing>();
于 2011-02-02T13:01:00.407 回答
0

从技术上讲,这在某些情况下应该是允许的。即在 c#4 中使用协方差和一些反射。我相信所有需要的更改都是使 IQueryOver 接口协变。

subType = typeof(ParentClass).Assembly.GetType(subTypeFullName);

var mi = typeof(QueryOver).GetMethod("Of", new Type[]{});
var gmi = mi.MakeGenericMethod(subType);
var qo = (QueryOver<ParentClass, ParentClass>)gmi.Invoke(null, null);
var queryOver = qo.GetExecutableQueryOver(session);

// your comment restrictions/projections here.

我已经与这个想法搏斗了,只要我们可以针对 .Net 4 进行构建,它应该很容易工作。

于 2011-08-17T20:10:45.033 回答