NHibernate Aliasing中的错误

时间:2012-03-02 14:10:48

标签: c# sql nhibernate formula

我正在使用NHibernate进行数据库管理。 在一个类中,我使用以下公式计算属性:

(SELECT MIN(x.timestamp) FROM (SELECT MAX(r.Timestamp) AS timestamp, r.Meter_Id FROM Reading r, Meter m WHERE r.Meter_Id = m.Id AND m.Store_Id = Id GROUP BY r.Meter_Id) AS x)

生成的查询如下所示:

(SELECT MIN(x.timestamp) FROM (SELECT MAX(r.Timestamp) AS timestamp, r.Meter_Id FROM Reading r, Meter m WHERE r.Meter_Id = m.Id AND m.Store_Id = this_.Id GROUP BY r.Meter_Id) AS this_.x)

显然,AS语句中的名称被重命名为this_.x,这会导致错误。

这似乎是一个已知的错误:NHibernate JIRA #NH-2878

enyone有解决方案吗?

3 个答案:

答案 0 :(得分:1)

我可能会弄错,但我实际上并不明白为什么你需要那个特定公式中的别名。

从更一般的意义上讲,您有几个选择:

  • 解决此问题。您可以使用存储过程,或加载更多数据并在内存中进行计算。
  • 修复它。 NHibernate是开源的 - 下拉代码,查找原因,在测试中隔离它,修复它,然后发送拉取请求。
  • 让其他人修复它。如果您的公司正在使用NHibernate,这对他们很重要,他们可能会赞助另一个NHibernate贡献者来实施修复。

答案 1 :(得分:1)

在Fluent NHibernate Map.Formula()方法中调用数据库函数时遇到了同样的问题。我的解决方法是重复完整的函数名称,而不是尝试使用ailas。

例如,EntityColumn2是一个已经被引用\加载到实体中的列。

SELECT My_Db_Function.Column1
FROM My_Db_Function(arg1, arg2, arg3, ...) 
WHERE My_Db_Function.Column2 = EntityColumn2

结果是 My_Db_Function 引用保持原样(NHibernate没有别名),并且NHMInate正确地别名EntityColumn2。

答案 2 :(得分:0)

我不知道如何解决这个问题,但您可以尝试按如下方式编写计算:

SELECT TOP 1 MAX(r.Timestamp) AS timestamp
FROM Reading r, Meter m
WHERE r.Meter_Id = m.Id AND m.Store_Id = Id
GROUP BY r.Meter_Id
order by Max(r.timestamp) asc