将 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

Join Unrelated tables in Fluent Nhibernate with QueryOver or CreateCriteria NHibernate HQL Inner Join (SQL Server,Visual C#)

它不是像 QueryOver 那样好的 C# API,但它会起作用。

【讨论】:

谢谢@Radim Kohler

以上是关于将 SQL 查询转换为 NHibernate的主要内容,如果未能解决你的问题,请参考以下文章

将 SQL 查询转换为 NHibernate

将 sql 查询转换为 linq 查询

如何将 linq 查询转换为 SQL 查询?

将 SQL 子查询转换为 Linq 查询

将 SQL 查询转换为红移

将 SQL 查询转换为 Hive 查询