我正在将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中的数据相关联。这两个表之间的联系很复杂:
首先使用实体框架代码我不能使用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连接)的等效投影?或者我最好(因为表现可能很差):
由于
答案 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'))
};