2012-03-26 57 views
1

Considoring以下查询:Nhibernate的采取跳过不产生正确的SQL

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' 
+0

不熟悉这些东西 - 是否可以将呼叫转换为“Take”和“Select”? – 2012-03-26 13:04:05

+0

@Damien_The_Unbeliever我敢肯定,这将带回整个记录,而不仅仅是名称,更差的表现没有区别。 Stuart你用来执行查询的EXACT代码是什么?和什么版本的NHibernate?由于上面的代码实际上没有解决(没有ToList或替代方案)。我尝试了一个非常类似的查询,并且使用了这个输出:selectPTO(@ p0)fundingpac0_.EffectiveDate as col_0_0_ from FundingPackage fundingpac0_ where fundingpac0_.DeletedDate is null; @ p0 = 10 [Type:Int32(0)] – mattytommo 2012-03-26 13:05:51

+0

这个semi- SQL附近的结尾(但不是结尾)冒号是有问题的;它肯定会将分号后的资料留作无效的Informix SQL。我没有看到任何与“Take(10)”相对应的东西。 – 2012-03-26 18:52:22

回答

1

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

@mattytommo是正确的,你已经忘了 “列表()”:

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

你用过QueryOver?

+0

哦,对不起!我正在使用ToList(),但在我的示例中,有一些如何忘记它...(更新!) 我正在使用3.1.0.4000,但我使用的是Informix数据库.... – 2012-03-26 15:34:36

+0

这意味着你已经使用NHibernateLinq提供程序,但我尝试在SqlServer上使用QueryOver。但你可以尝试改变“session.Query ”到“session.QueryOver ()”。 – Anton 2012-03-27 10:57:49

+0

恐怕我不能使用QueryOver,因为它返回一个指定的NH类型,我需要返回一个IQueryable ... – 2012-04-05 15:13:29

相关问题