簡體   English   中英

nhibernate 加入條件幫助

[英]nhibernate join criteria help

我有一個連接 DriverImages 的表 DriverScans。 我想返回所有 DriverScans,其中任何 DriverImage 的 Sent 字段等於 false。

本質上

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();

您必須使用 CreateCriteria 嗎? 您可以使用 HQL 輕松完成此操作。 這些方面的東西應該為你做。

SELECT d
FROM DriverScan d
JOIN d.DriverImages i
WHERE i.Sent = 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 屬性,直到需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM