我需要能够使用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的重复。
答案 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
必须来自映射关系多对一