使用nhibernate按子集合中对象的值进行过滤

时间:2010-10-02 00:13:16

标签: sql nhibernate fluent-nhibernate linq-to-nhibernate

这是设置。

NHibernate,Fluent NHibenrate和Nhibernate Linq

隐身的实体是

  • 故障 - 发生故障的记录
  • 警报 - 有关故障的信息,将其视为故障类型(可能发生的所有可能故障的列表)
  • AlarmDescription - 人类可读的描述,每种语言一种

故障有警报,警报有一组描述,系统中每个langague一个。

许多故障都可以引用警报。

当用户搜索其中一个参数时,他们可以按描述搜索(和排序)故障。这意味着传递使用的特定语言。

要完成的SQL很容易入手:

SELECT f.*, a.*, d.Description
FROM Fault f
JOIN Alarm a ON f.Alarm_id = a.Id
JOIN AlarmDescription d ON a.Id = d.Alarm_id AND d.Language = @lang

以上查询会给我所有错误,警报和所选语言的描述。

但是,让Nhibernate生成这样的查询很困难。

因此,归结为其中一个过滤器是主要对象的子对象的子集合。我试图使用Linq2Nhibenrate,HQL并尝试使Native SQL也能正常工作。原生SQL似乎最有可能成功,但我无法弄清楚如何正确映射别名。我想要任何解决方案,包括更改域模型。这个让我很难过。

1 个答案:

答案 0 :(得分:0)

这是一个可能的HQL:

select f, d.Description
from Fault f
join fetch f.Alarm a
join a.Descriptions d
where d.Language = :lang

这将检索元组列表(object[2]),其中第一个元素是Fault(带有初始化的Alarm),第二个元素是所选语言的描述文本。