将 SQL 查询转换为 NHibernate
Posted
技术标签:
【中文标题】将 SQL 查询转换为 NHibernate【英文标题】:Converting SQL Query to NHibernate 【发布时间】:2017-03-11 12:46:31 【问题描述】:我有一个 SQL 查询,我正在尝试将其转换为 Nhibernate 查询并运行它。
SQL 查询
SELECT
A.*
FROM
TestTable i
LEFT JOIN
TestTable o
ON
i.testColumn=o.testcolumn and i.testColumn1='TestColumn1'
WHERE o.StartDate <= '2016-10-28' and i.testColumn2 > 3
休眠查询
ObjectA 是 C# 对象版本的 TestTable
ObjectA o = null;
ObjectA i = null;
var query = Session.QueryOver(() => o)
.Left.JoinQueryOver(() => i)
.Where(() => o.testColumn == i.testColumn)
.Where(() => i.testColumn1 == "TestColumn1")
.Where(() => i.testColumn2 == 3
.Where(() => o.StartDate <= '2016-10-28')
return query.Take(100).List();
映射
public ObjectATableMap : ClassMap<ObjectA>
Schema("[Test]");
Table("[TestTable]");
Id(x => x.Id, "Id").GeneratedBy.Native();
Map(x => x.TestColumn1, "TestColumn1");
Map(x => x.TestColumn2, "TestColumn2");
Map(x => x.StartDate ,"StartDate");
当我运行上述查询时,我收到以下消息 “无法解析属性:i of:ObjectA” 谁能给我提供正确的休眠查询。 谢谢
【问题讨论】:
JoinQueryOver
需要一个具有关系的属性的表达式。你可以在这里看到一个例子***.com/a/5420791/1486443
@RadimKohler 映射已显示
@Najera 我会看看谢谢
@Sike12 我试图在答案中解释这个问题。因为我期望这样的映射。这根本不可能……加入不相关的表……
@RadimKöhler 它是一个自我加入。所以我不确定这怎么可能?
【参考方案1】:
一个错误:
“无法解析属性:i of: ObjectA”
与语句有关
Session.QueryOver(() => o)
.Left.JoinQueryOver(() => i)
因为它期望 class ObjectA
(o) 引用 class ObjectA
(i)。通常是父母子女
public class ObjectA
public virtual ObjectA Parent get; set;
...
如果没有关系 - 我们不能使用QueryOver
API。我们可以使用 HQL
它不是像 QueryOver 那样好的 C# API,但它会起作用。
【讨论】:
谢谢@Radim Kohler以上是关于将 SQL 查询转换为 NHibernate的主要内容,如果未能解决你的问题,请参考以下文章