【问题标题】:Get item index (rownum)获取项目索引(rownum)
【发布时间】:2012-04-19 21:56:39
【问题描述】:

我有一个包含 10 000 个元素的表格。

 IQuerable<IEntity> query = dataRep.Get<IEntity>()
                                   .Query();

我需要获取所选obj 的索引(rownum)而不获取所有表项

 var obj = query.Where( x => x.Name == "testName")
                .FirstOrDefault();

简单的 sql 工作正常:

 select name, id, r from 
 (
     select name, id, rownum r from collections order by id
 ) where name = 'testName';

在 Linq to NHibernate 中如何做到这一点?

编辑:

我尝试添加到IEntity 类属性RowNumber 并将其映射到hbm 上

  <property name="RowNumber" formula="rownum" />

但是之后

  var index = query.Where( x => x.Name == "testName")
                   .Select( x => x.RowNumber)
                   .FirstOrDefault();

始终获取1 值

【问题讨论】:

  • 我假设是 Oracle? rownum 基于行在其结果集中的位置,因此如果在只返回一个结果的查询的顶层调用它,它只能等于 1。
  • @Damien_The_Unbeliever。你说的对。如果块 where name='testName' 将与 rownum 处于同一级别 - 结果始终为 1
  • 我必须删除一个标签,以便添加 Oracle 的标签 - 我选择了 .NET,但您可能有不同的看法;但这将归结为与 NHbernate 争吵以生成特定于 Oracle 的特定 SQL,因此确实需要在这两种技术之间进行重叠以希望获得一些专业知识。

标签: c# linq oracle nhibernate linq-to-nhibernate


【解决方案1】:

你不能直接过滤查询吗?

IQuerable<IEntity> query = dataRep.Get<IEntity>()
                                  .Query()
                                  .FirstOrDefault(x => x.Name == "testName");

编辑:

要获取项目,您可以将其投影为匿名类型:

var query = (from data in dataRep.Get<IEntity>().Query()
             where Name == "testName"
             select new
             {
                 id = data.id,
                 rowNumber = data.rowNumber
             }).FirstOrDefault();

【讨论】:

  • 我需要获取项目的索引,而不是项目。
  • @Kronos - 已编辑以显示如何投影到匿名类型中以获取 SQL 中所述的 id/行号。
  • IEntity 对象不包含属性rowNumber! data.rowNumber - 将是编译错误!
  • 您必须:将属性添加到类定义中或省略 rowNumber 字段。
  • 我做到了。但是这个属性应该是什么映射?我尝试使用&lt;property name="rowNumber" formula="rownum" /&gt;。该值始终为1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多