在 C# 中的 NHibernate 条件中使用 SQL "IsNull()" 命令



我需要能够与NHibernate标准一起使用,即C#.NET中SQL的IsNull()函数。我不需要在 LINQ 中使用它。这意味着表 1 具有以下列:

Name | Description

表 2 包含以下列:

OriginalDescription | TranslatedDescription

Table1.Description = Table2.OriginalDescription.我将如何使用 NHibernate 条件编写以下 SQL 语句:

SELECT Table1.Model, IsNull(Table2.TranslatedDescription, Table1.Description)
FROM Table1
LEFT JOIN Table2 ON Table2.OriginalDescription = Table1.Description

上面的 SQL 语句将给我名称,如果存在翻译描述,则为我翻译描述,否则它将返回描述作为记录。表 2 中不能有重复的原始描述。

ISNULL 的解决方案可以这样表示:

// here is the criteria of the "Entity1" and the join to the "Entity2"
var criteria = session.CreateCriteria("Entity1", "table1");
criteria.CreateAlias("Entity2", "table2");
// here we drive the SELECT clause
criteria.SetProjection(
    Projections.ProjectionList()
        .Add(Projections.Property("Model"))
        .Add(Projections.SqlFunction("COALESCE", NHibernateUtil.String
            , Projections.Property("table2.TranslatedDescription")
            , Projections.Property("table1.Description")
            ))
    );
// just a list of object arrays
var list = criteria.List<object[]>();

所以,我们在这里所做的,是SqlFunction的召唤。在这种情况下,NHibernate附带的许多方言中开箱即用的映射之一(但我们甚至可以使用自定义方言扩展方言,例如如何:Nhibernate计数不同(基于多列))

必须注意,JOIN 子句来自映射。所以这个Table2.OriginalDescription = Table1.Description必须来自多对一的映射关系

最新更新