2017-07-04 2 views
1

私は2つのテーブルがあります。流暢NHibernateはQueryOver(左結合)

すべて: IDを| propA | propB | someOtherColumn

hidden: id | propA | propB

及び対応するクラス(マッピングされ、まだマッピングされない関係)

Iは最初のテーブルからすべての行を取得したい、マイナスがpropa又はpropBプロパティによって一致する結果になります。

Criteria APIを使用して管理しましたが、可能な場合はサブクエリを除いて左側に除外結合を使用して、QueryOver APIでどのように処理されているかを確認したいと考えています。

基準バージョン:

var dc1 = DetachedCriteria.For<hidden>() 
    .Add(Restrictions.IsNotNull(Projections.Property("propA"))) 
    .SetProjection(Projections.Property("propA")); 

var dc2 = DetachedCriteria.For<hidden>() 
    .Add(Restrictions.IsNotNull(Projections.Property("propB"))) 
    .SetProjection(Projections.Property("propB")); 



var query = db 
    .CreateCriteria<all>() 
    .Add(Restrictions.On<all>(c => c.someOtherColumn).IsLike("1")) 
    .Add(Subqueries.PropertyNotIn("propA", dc1)) 
    .Add(Subqueries.PropertyNotIn("propB", dc2)) 

およそ与える:

SELECT all.* 
FROM all 
WHERE (all.someOtherColumn LIKE '1') 
    and all.propA not in (SELECT hidden.propA FROM hidden WHERE hidden.propA IS NOT NULL) 
    and all.propB not in (SELECT hidden.propB FROM hidden WHERE hidden.propB IS NOT NULL) 

それは、パフォーマンスと思われるものの賢明な、これが良いだろう、okです:

SELECT all.* 
FROM all 
LEFT JOIN hidden ON all.propA = hidden.propA 
LEFT JOIN hidden ON all.propB = hidden.propB 
WHERE hidden.propA IS NULL 
AND hidden.propB IS NULL 
AND (all.someOtherColumn LIKE '1') 

されていない場合マップされていない関係でそのようなステートメントを生成することは可能ですが、私はマッピングに関する提案に自由に対応しています。

答えて

2

QueryOverを使用してマッピングされたリレーションシップなしにジョインを作成することはできないようです。 これを参照してくださいanswer。サブクエリで

あなたはこのような何かを行うことができます。

All allAlias = null; 
var result = Session.QueryOver(() => allAlias) 
       .WhereRestrictionOn(x => x.someOtherColumn).IsLike('1') 
       .WithSubquery.WhereNotExists(QueryOver.Of<hidden>() 
        .Where(h => h.propA == allAlias.propB || h.propB == allAlias.propB) 
        .Select(h => h.Id)) 
       .List();