【问题标题】:nhibernate join criteria helpnhibernate 加入条件帮助
【发布时间】:2011-06-30 20:16:22
【问题描述】:

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

【问题讨论】:

    标签: nhibernate criteria


    【解决方案1】:

    您必须使用 CreateCriteria 吗?您可以使用 HQL 轻松完成此操作。 这些方面的东西应该为你做。

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

    【讨论】:

    • 我该怎么做?这是使用 CreateSQLQuery 吗?当我使用 CreateSQLQuery 时,它可以工作,但无法将 List 转换为 query.List.
    • 您可以使用 Session.CreateQuery(query).ToList()。如果您需要更多信息,请告诉我。
    • 完美运行,HQL 看起来是编写查询的真正简单方法。
    【解决方案2】:

    未经测试,我不知道您如何将 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 属性,直到需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多