【问题标题】:Converting SQL Query to NHibernate将 SQL 查询转换为 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 需要一个具有关系的属性的表达式。你可以在这里看到一个例子stackoverflow.com/a/5420791/1486443
  • @RadimKohler 映射已显示
  • @Najera 我会看看谢谢
  • @Sike12 我试图在答案中解释这个问题。因为我期望这样的映射。这根本不可能……加入不相关的表……
  • @RadimKöhler 它是一个自我加入。所以我不确定这怎么可能?

标签: c# sql .net nhibernate


【解决方案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
猜你喜欢
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
相关资源
最近更新 更多