将SQL查询转换为NHibernate

本文关键字:NHibernate 转换 查询 SQL | 更新日期: 2023-09-27 18:15:28

我有一个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

Nhibertnate查询

ObjectA是TestTable的c#对象版本

 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"谁能给我提供正确的hibernate查询。由于

将SQL查询转换为NHibernate

错误:

"无法解析属性:i of: ObjectA"

与语句

相关
Session.QueryOver(() => o)
        .Left.JoinQueryOver(() => i)

,因为它期望class ObjectA (o)引用class ObjectA (i)。通常parent - child

public class ObjectA
{
    public virtual ObjectA Parent { get; set; }
    ...
}

如果没有关系,我们不能使用QueryOver API。我们可以使用HQL

  • 使用QueryOver或createcrcriteria在Fluent Nhibernate中连接不相关的表
  • NHibernate HQL Inner Join (SQL Server,Visual c#)

它不像QueryOver那样有很好的c# API,但它可以工作。