2011-06-30 10 views
1

私はDriverImagesを結合するテーブルDriverScansを持っています。どのDriverImageにもSentフィールドがfalseであるすべてのDriverScansを返すようにしたい。nhibernate結合基準ヘルプ

基本的に

SELECT DriverScan.* 
FROM DriverScan 
INNER JOIN DriverImages 
ON DriverImages.DriverScanId = DriverScan.DriverScanId 
WHERE DriverImages.Sent = 0 

のみDriverScans以下のコードが、作成されたSQLクエリはインナー画像フィールドを含みDriverScanとDriverImagesの参加引き戻します。 SQLでDriverScanの情報のみが返されるように、コードを書くにはどうすればいいですか?

public IEnumerable<DriverScan> GetNewScans() 
{ 
    var session = GetCleanSession(); 
    var query = session.CreateCriteria(typeof(DriverScan)); 

    query.CreateCriteria("DriverImages", JoinType.InnerJoin) 
     .Add(Cr.Restrictions.Eq("Sent", false)); 

    return query.List<DriverScan>(); 
} 

DriverImagesに関連する私のマッピングが

HasMany<DriverDoc>(x => x.DriverDocs) 
    .WithKeyColumn("DriverScanId").IsInverse() 
    .Cascade.AllDeleteOrphan().LazyLoad(); 

答えて

1

あなたがのcreateCriteriaを使用しなければならないのですか?これはHQLで簡単に行うことができます。 これらの行には何かがあります。

var sentImagesQuery = DetachedCriteria.For<DriverImages>() 
    .Add(Expression.Eq("Sent",false)) 
    .SetProjection(Projections.Property("DriverScan.Id")); 

var results = session.CreateCriteria<DriverScan>() 
    .Add(Subqueries.PropertyIn("Id",sentImagesQuery)) 
    .List<DriverScan>(); 

生成する必要があります:

select * 
from DriverScan d 
where d.Id in (select DriverScanId from DriverImages where sent=0) 

今あなたがテストされていないと私はあなたがDriverImageにDriverScanをマッピングしているのか分からないが、私はあなたがこのような何かをしたいと思います

SELECT d 
FROM DriverScan d 
JOIN d.DriverImages i 
WHERE i.Sent = 0 
+0

どうすればよいですか?これはCreateSQLQueryを使用していますか? CreateSQLQueryを使用したとき、それは機能しましたが、リストをquery.Listに変換できませんでした。。 – strattonn

+0

Session.CreateQuery(query).ToList ()を使用できます。あなたがより多くの情報を必要とするかどうかを教えてください。 – TheITGuy

+0

完璧に動作し、HQLはクエリを書くための本当の簡単な方法のように見えます。 – strattonn

0

結果セットを遅くする画像列をロードしないでください。 オプションでNH3では、必要になるまでImageプロパティを怠惰に読み込む「レイジープロパティ」を見ることができます。