【问题标题】:How to get sequence number of row using Entity Framework?如何使用实体框架获取行的序列号?
【发布时间】:2011-10-25 16:39:33
【问题描述】:

我有 SQL 查询:

WITH OrderedRecs AS
(select ROW_NUMBER() OVER(ORDER BY RecID) as seqNumber,* from Records where RecordGroupID=7)
SELECT * FROM OrderedRecs where RecordID=35

如何使用实体框架获得相同的结果?

【问题讨论】:

  • 你的意思是where seqNumber=35
  • 不,我需要有特定ID的记录,但有序列号,这是通过对所有记录按任意顺序排序得到的
  • 而不是 RecordID=35 可能是更复杂的条件
  • 好的。所以RecordIDRecords 中的一个字段。 seqNumber 只会对满足RecordGroupID=x 的记录进行编号,因此行号将取决于该条件,可以吗?

标签: c# sql entity


【解决方案1】:

纯 LINQ 解决方案是:

records.Where(rec => rec.RecordGroupID == 7)
    .OrderBy(rec => rec.RecId).AsEnumerable()
    .Select((rec, i) => new { i, rec })
    .Where(anon => anon.i == 35)
    .Select(anon => anon.rec).First()

但是,您必须对符合第一个条件的所有记录都在本地获取这一事实感到满意。

编辑:

在你参加比赛之后:可能是这样的:

IEnumerable<SortedRecord> GetSortedRecords(IQueryable<Record> records
    , Func<SortedRecord, bool> sortedRecordPredicate)
{
    return
      records.Where(rec => rec.RecordGroupID == 7)
        .OrderBy(rec => rec.RecId).AsEnumerable()
        .Select((rec, i) => new SortedRecord{ Sequence = i, Record = rec })
        .Where(sortedRecordPredicate);
}

var result = GetSortedRecords(records, rec => rec.Record.RecordID = 35);

SortedRecord 显然现在是一个类型,可以输入各种条件。 (语法未检查)。

一种完全不同的方法是在WITH 子句中查看查询。

【讨论】:

    【解决方案2】:

    您不能将 SeqNumber 作为派生(或鉴别器)列添加到基本实体吗? See previous example。您必须自己分配。

    【讨论】:

      猜你喜欢
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多