4

親愛なるNHibernateの専門家へ

次のクエリでは、すべてのカテゴリが表示されます。

var result = Session.QueryOver(() => cat).List();

.. このクエリを実行すると、選択されたもの (category_x_product テーブル) が取得されます。

int productId = 11;
Category cat = null;
CategoryProduct cp = null;

var subQuery = QueryOver.Of(() => cp)
        .Where(() => cp.ProductId == productId)
        .Select(Projections.Distinct(Projections.Property(() => cp.CategoryId)));

result = Session.QueryOver(() => cat)
                .WithSubquery
                .WhereProperty(() => cat.Id).In(subQuery)
                .List();

これら 2 つのクエリを組み合わせる任意の方法で、CategoryProduct クエリで実際に「選択」されたカテゴリを示すブール値を持つすべてのカテゴリを取得します。

たぶん、このようなエンティティにマップしますか?

CategorySelected
----------------
Category Category { get; set; }
bool IsSelected { get; set;

QueryOver を使用してこれに対する答えを見つけようとしましたが、成功しませんでした。これは、「多かれ少なかれ」単純なクエリでも可能ですか? どんな助けでも大歓迎です。ありがとう!

ミカル

4

1 に答える 1

3

これを実現する 1 つの方法は、条件付き SELECT ステートメントを作成することです。SQL Server の場合、このようなものを生成したいと考えています

SELECT CASE CategoryId IN (.... subselect ) THEN 1 ELSE 0 END ...

しかし、NHibernate と抽象クエリ API のおかげで、サポートされているすべての DB ダイアレクトで動作するクエリを作成できます。

新しいソリューションのドラフトを作成してみましょう。SubQueryまずは調整いたします

var subQuery = QueryOver.Of(() => cp)
    .Select(Projections.Distinct(Projections.Property(() => cp.CategoryId)));

次に、条件文を作成します

var isSelected = Projections.Conditional(
    Subqueries.PropertyIn("Id", subQuery) // Category ID to be in the inner select
    , Projections.Constant(1)
    , Projections.Constant(0)
);

そして、その条件を に注入し、QueryOverそれを使用して、カテゴリ( virtual を含む)Transformersのプロパティを正しく設定します。IsSelected

Category category = null
result = Session.QueryOver(() => cat)
    // SELECT clause is now built
    .SelectList(list => list
        .Select(isSelected).WithAlias(() => category.IsSelected)
        .Select(ca => ca.Id).WithAlias(() => category.Id)
        ... // all properites we would like to be populated
    )
    // Transform results into Category again
    .TransformUsing(Transformers.AliasToBean<Category>())
    .List<Category>();

そして今、マップされていないが、この SELECT (projections)IsSelectedにのみ使用される新しいプロパティには、正しい情報が入力されています。

注: このアプローチは機能していますが、ステートメントはドラフトとして解釈する必要があります。あなたの場合、いくつかの調整が必要になる可能性があります...

于 2013-09-15T14:58:59.383 に答える