[英]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.