在C#中的NHibernate标准中使用SQL“IsNull()”命令

时间:2014-02-27 20:05:15

标签: c# sql nhibernate

我需要能够使用NHibernate标准,C#.NET中的SQL的IsNull()函数。我不需要将它与LINQ一起使用。 表示Table1具有以下列:

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

如果存在TranslatedDescriptions,上面的SQL语句将为我提供Names和TranslatedDescriptions,否则它将返回记录的描述。 Table2中不能有OriginalDescription的重复。

1 个答案:

答案 0 :(得分:3)

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 一起映射(但我们甚至可以用自定义方言扩展方言,例如:{{3 }})

必须注意,JOIN子句来自映射。因此,此Table2.OriginalDescription = Table1.Description必须来自映射关系多对一