Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中的NHibernate条件中使用SQL“IsNull()”命令_C#_Sql_Nhibernate - Fatal编程技术网

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

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语句:

我需要能够使用NHibernate标准,即C.NET中SQL的IsNull函数。我不需要和LINQ一起使用它。 这意味着表1包含以下列:

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。。。希望有帮助;这是我的猜测,我不得不说。真的很有趣,他们选择了两者都不实现。下面的文章是一个很好的总结,说明了为什么您可能希望使用一个而不是另一个。。。