【发布时间】:2014-11-13 08:40:11
【问题描述】:
NHibernate / QueryOver API 中是否有办法传递映射中已有的参数(因此它使用该参数作为此特定实例上所有查询的固定值)。
我需要这个(或解决方法),因为我在数据库中有这样的视图:
CREATE VIEW ProblematicView
AS
SELECT
v.*,
-- lots of data
FROM someView v
LEFT JOIN someTable t ON v.ForeignKey = t.ForeignKey
现在除了 ForeignKey 匹配之外,我还需要对这样的属性进行额外检查:
AND t.SomeOtherValue = @myParameter
这是不可能的,因为无法直接将参数传递给视图。使用表值函数这是可能的,但我不知道如何将它映射到 NHibernate / QueryOver。
此外,函数方法很难实现,因为使用巨大的 QueryOver 语句来过滤所有剩余的属性(因为视图用于搜索业务实体)
目前我正在将 SomeOtherValue / @myParameter 过滤器作为我的 QueryOver 的一部分应用于整个视图。
这是我的主要问题:
使用例如:
SELECT
v.*,
-- lots of data
FROM someView v
LEFT JOIN someTable t ON v.ForeignKey = t.ForeignKey AND t.SomeOtherValue = 123
(followed by alot of other property checks...)
将返回不同的结果(由于左连接,t.SomeOtherValue 的 NULL 条目包含在意图中)
比使用:
SELECT * FROM ProblematicView where SomeOtherValue = 123
(followed by alot of other property checks)
由于现在左连接发生在视图内部而不检查 SomeOtherValue 并且 SomeOthervalue 检查独立于左连接应用,因此所有 NULL 值都将被排除(这是错误的业务逻辑)。
同时使用:
SELECT * FROM ProblematicView where SomeOtherValue = 123 OR SomeOtherValue = NULL
(followed by alot of other property checks)
似乎没有帮助,因为仍然会忽略 NULL 值...
所以我能想象解决这个问题的唯一方法是找到一种方法以某种方式将我的 SomeOtherValue 属性传递给视图,以便它可以将其用作视图本身的参数(而不是在 where 子句中)或者可能以某种方式使用基于 sql 表的函数和模型参数...
编辑:
经过更多研究,我希望能简化问题:
我正在尝试转换此 SQL:
Select v.*, ... from (someView v LEFT JOIN someTable t ON v.ForeignKey = t.ForeignKey)
WHERE SomeOtherValue = 123
(其中 SomeOtherValue 来自 someOtherTable)
到这里:
Select v.*, ... from someView v LEFT JOIN someTable t on v.ForeignKey = t.ForeignKey
AND t.SomeOtherValue = 123
使用 NHibernate / QueryOver。请注意,在第二个版本中,属性 SomeOthervalue 直接在左连接中进行检查,而在第一个版本中,它仅在左连接后才被错误地应用。
我需要找到一种方法来编写后面的 SQL 语句,以便我可以将它放在视图中,同时仍然能够将 123 作为 SomeOtherValue 的参数传递。
【问题讨论】:
标签: c# sql nhibernate queryover