【问题标题】:NHibernate join + coalesceNHibernate 加入 + 合并
【发布时间】:2012-10-16 14:39:45
【问题描述】:

这是实际架构的简化示例,请多多包涵。我有一个表foo 有一个id 和一个value 列。还有一个bar 表,带有一个指向foo 表的FK,并且该表有一个extended_value 列。我想让 Foo 的类映射左加入 Bar 并尝试使用它的 extended_value 列(如果存在),否则回退到 Foo 的 value

这是我需要的 SQL 等价物:

select coalesce(b.extended_value, f.value) as value
  from foo f
  left join bar b on (b.id = f.id)

我在 NHibernate 之上使用 Fluent。这是我一直在尝试使用的:

Join("bar", m =>
{
    m.Optional();
    m.KeyColumn("id");
    m.Map(foo => foo.Value).Formula("COALESCE(extended_value, value)");
});

但这失败了,因为生成的 SQL 期望 extended_valuevalue 在同一个表上。

有什么想法吗?

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate fluent-nhibernate-mapping


    【解决方案1】:

    我的建议是不要在映射中这样做。

    独立映射foo.valuebar.extended_value,然后在查询中使用coalesce 和/或创建使用?? 运算符的未映射属性。

    【讨论】:

    • 为什么不建议这样映射?
    • IMO 是业务逻辑,它应该驻留在业务对象(域模型)中,而不是映射中,因为当没有数据库时,此属性会失效,在这种情况下,这样做并没有真正的性能优势SQL。
    【解决方案2】:

    我会使用 Diego Mijelshon 的建议,但以下应该也可以工作

    // FooMap
    Map(foo => foo.Value).Formula("COALESCE((select b.extended_value from bar b WHERE b.id = id), value)");
    

    【讨论】:

    • 我最终接受了 Diego 的建议,并将该逻辑封装在域对象中。出于进一步的好奇,上面的公式会导致 n+1 查询吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多