在nHibernate中开始使用复杂投影

时间:2011-11-24 10:32:11

标签: nhibernate queryover

我正在将nHibernate和Entity Framework视为可能的ORM引入系统。我试图使用nHibernate执行与以下SQL相同的操作:

SELECT
   a.Id,
   a.Name,
   a.Etc,
   MAX(CASE WHEN (c.dId IS NOT NULL) THEN 1 ELSE 0 END) As IsLinked
FROM
   tA a
   INNER JOIN tAB ab ON a.Id = ab.aId
   INNER JOIN tB b ON ab.bId = b.Id
   LEFT OUTER JOIN tC c ON b.cId = c.Id
   AND c.dId = 'x'
WHERE
   a.Id = 'y'
GROUP BY
   a.Id,
   a.Name,
   a.Etc,

基本上我想从表tA中进行选择,并检查tA中的条目是否与表tC中的数据相关联。这两个表之间的联系很复杂:

  • tA与tB有多对多关系(使用表格tAB)
  • tB使用外键tB.cId
  • 与表tC有一对多的关系
  • tC有一个外键tc.dId到另一个表tD

首先使用实体​​框架代码我不能使用Include,因为它不允许过滤,但我可以使用投影,所以我使用以下方式获得功能正确的查询:

var query = from a in db.As
            where a.Id == 'y'
            select new
            {
               a,
               IsLinked = a.Bs
                           .Select(b => b.Cs)
                           .Select(c => c.Where(n => n.dId == 'x'))
                           .Select(h => h.Count()).Max() > 0
             };

生成的SQL复杂而缓慢,但有效。我很难从QueryOver开始在nHibernate中实现相同的功能:

var query = session.QueryOver<A>().Where(a => a.Id == 'y');

如何在不诉诸HQL的情况下创建跨多个/嵌套连接类型(一个是OUTER连接)的等效投影?或者我最好(因为表现可能很差):

  • 进行两个查询(一个检索数据,一个建立链接)
  • 介绍封装连接复杂性的视图

由于

1 个答案:

答案 0 :(得分:1)

这个查询应该是等价的,你可以试试吗?

var query = from a in db.As
        where a.Id == 'y'
        select new
        {
           a,
           IsLinked = a.Bs.SelectMany(b => b.Cs).Any(c => c.dId == 'x')
           // or
           IsLinked = a.Bs.Any(b => b.Cs.Any(c => c.dId == 'x'))
         };