我有一个连接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();
答案 0 :(得分:1)
您是否必须使用CreateCriteria?您可以使用HQL轻松完成此操作。 这些方面的东西应该为你做。
SELECT d
FROM DriverScan d
JOIN d.DriverImages i
WHERE i.Sent = 0
答案 1 :(得分: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属性直到需要。