C# 在C中的NHibernate条件中使用SQL“IsNull()”命令
我需要能够使用NHibernate标准,即C.NET中SQL的IsNull函数。我不需要和LINQ一起使用它。 这意味着表1包含以下列:C# 在C中的NHibernate条件中使用SQL“IsNull()”命令,c#,sql,nhibernate,C#,Sql,Nhibernate,我需要能够使用NHibernate标准,即C.NET中SQL的IsNull函数。我不需要和LINQ一起使用它。 这意味着表1包含以下列: Name | Description OriginalDescription | TranslatedDescription 表2有以下列: Name | Description OriginalDescription | TranslatedDescription 和表1。说明=表2。原始说明。 如何使用NHibernate标准编写以下SQL语句:
Name | Description
OriginalDescription | TranslatedDescription
表2有以下列:
Name | Description
OriginalDescription | TranslatedDescription
和表1。说明=表2。原始说明。
如何使用NHibernate标准编写以下SQL语句:
SELECT Table1.Model, IsNull(Table2.TranslatedDescription, Table1.Description)
FROM Table1
LEFT JOIN Table2 ON Table2.OriginalDescription = Table1.Description
上面的SQL语句将为我提供名称和TranslatedDescriptions(如果TranslatedDescriptions存在),否则它将返回记录的描述。
表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提供了许多方言中的一种现成的映射,但我们甚至可以使用自定义方言扩展方言,例如如何:
必须注意,JOIN子句来自映射。因此,此Table2.OriginalDescription=Table1.描述必须来自多对一的映射关系无效的t、 翻译描述:t.描述不起作用?或t.翻译描述??t、 描述它可能,但我真的需要它在一个nhibernate标准…谢谢。如果没有外键呢?假设这两个表没有外键连接。。。有可能有这样的东西吗?连接总是由映射定义的,它来自关系定义。我们可以更严格地限制它。。。但我们不能创建自己的JOIN和ON子句。这就是ORM工具的共同工作方式。。。这不是我知道的最好的答案。。。但是。。。因为没有落实,;这就是全部。NHibernate的创建者只是在DB引擎周围寻找SQL函数的最小公分母。。。。聚结足以覆盖ISNULL。。。希望有帮助;这是我的猜测,我不得不说。真的很有趣,他们选择了两者都不实现。下面的文章是一个很好的总结,说明了为什么您可能希望使用一个而不是另一个。。。