2011-06-30 72 views
1

我有一個表DriverScans加入DriverImages。我想返回所有DriverScan,其中有DriverImage的Sent字段等於false。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輕鬆完成此操作。 沿着這些線應該爲你做。

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

我該怎麼做?這是使用CreateSQLQuery?當我使用CreateSQLQuery它工作但它不能將列表轉換爲查詢。列表。 – strattonn

+0

你可以使用Session.CreateQuery(query).ToList ()。讓我知道你是否需要更多信息。 – TheITGuy

+0

完美工作,HQL看起來像一個真正簡單的方式來編寫查詢。 – strattonn

0

沒有測試過,我不知道你是如何映射到DriverScan但DriverImage我想你想是這樣的:

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) 

現在你不要加載可能會減慢結果集的圖像列。 (可選)在NH3中,您可以查看「懶惰屬性」,它會延遲加載Image屬性直到需要。