【问题标题】:Nhibernate take skip not producing correct sqlNhibernate 跳过不产生正确的 sql
【发布时间】:2012-03-26 08:46:39
【问题描述】:

考虑以下查询:

session.Query<Brand>()
       .Where(x => x.Name == "Clause")
       .Select(a => a.Name)
       .Take(10)
       .ToList();

NHibernate 没有生成正确的 SQL - 它似乎没有添加限制器并且似乎正在生成接收代码 - 不是在 SQL 中。

有什么想法吗?

生成的 SQL:

select brand0_.br_name as col_0_0_ from Brands brand0_
 where brand0_.br_name=?;p0 = 'Clause' 

【问题讨论】:

  • 不精通这些事情 - 是否可以逆转对 TakeSelect 的调用?
  • @Damien_The_Unbeliever 我很确定这将带回整个记录,而不仅仅是名称,更糟糕的性能没有任何区别。 Stuart 您用来执行查询的确切代码是什么?什么版本的NHibernate?由于上面的代码实际上并没有得到解决(没有 ToList 或替代方案)。我尝试了一个非常相似的查询,它使用了这个输出: select TOP (@p0)fundingpac0_.EffectiveDate as col_0_0_ from FundingPackage fundpac0_ where fundpac0_.DeletedDate is null;@p0 = 10 [Type: Int32 (0)]
  • SQL 接近尾端(但不是尾端)的分号有问题;它肯定会将分号后的材料作为无效的 Informix SQL 留下。我看不到任何与“Take(10)”相对应的东西。
  • 您解决了吗?我在使用 postgresql 时也遇到了同样的情况,也许 Take() 方法在方言中没有正确实现?我不知道..
  • 嗨 Pablote,我发现解决此问题的最佳方法是使用 HQL,它生成的 SQL 几乎与您编写的内容相匹配,而且它仍然是跨 SQL 引擎!我发现 LINQ 是非常主观的,如果你写得不正确,它会提供非常不寻常的结果..

标签: sql linq nhibernate informix linq-to-nhibernate


【解决方案1】:

我正在使用这样的代码,它在 SQL 中有“TOP”。 (NHibernate 3.1 版)

@mattytommo 是对的,你忘记了“List()”:

session.Query<Brand>()
       .Where(x => x.Name == "Clause")
       .Select(a => a.Name)
       .Take(10)
       .List();

你用过 QueryOver 吗?

【讨论】:

  • 对不起!我使用的是 ToList() 但在我的示例中有些忘记了它......(更新!)我使用的是 3.1.0.4000 但我使用的是 Informix 数据库......
  • 这意味着您使用了 NHibernateLinq 提供程序,但我尝试在 SqlServer 上使用 QueryOver。但是您可以尝试将“session.Query”更改为“session.QueryOver()”。
  • 我恐怕不能使用QueryOver,因为它返回一个特定的NH类型,我需要返回一个IQueryable...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多