1

現在、Criteria APIを使用していて気に入っていますが、QueryOverAPIに切り替えることができればさらに良いでしょう。しかし、私の設定は少し奇妙です。データをテーブルに分割するために、1つの基本抽象クラスがあります。

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 に答える