nhibernate加入标准的帮助

时间:2011-06-30 20:16:23

标签: nhibernate criteria

我有一个连接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();

2 个答案:

答案 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属性直到需要。