按行号查找实体

时间:2017-08-21 21:36:44

标签: c# entity-framework entity-framework-core

在EF中,当必须处理索引时,我们需要将实体集合转换为列表IQueryableIEnumerable不实现任何索引器(由于延迟执行,它将毫无意义机制)。当使用ToList使用索引的相当大的集合时,会很重。

这就是为什么我有时需要按行号(而不是标识/主键)查找实体。例如,我有一条记录,我想得到它的行号(在排序表中的位置)并得到下一条记录。

这可以在实体框架中实现吗?我可以发送SQL查询来执行此操作,但我很好奇是否有Linqish和EF特定的方法来执行此操作。

1 个答案:

答案 0 :(得分:0)

这可以通过调整DbContex并添加与行号对应的假实体来实现。可以利用此实体在SQL中使用内置的ROW_NUMBER()函数。例如:

public class RowNumber{
    public Int64 Row_Number {get; set;}
} 

然后添加这两个DbContext

public virtual DbSet<RowNumber> RowNumber {get; set;}

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<RowNumber>(x => {
            x.HasKey(e => e.Row_Number);
        });
 ...
}

现在我们可以进行以下查询:

var rowNumber = dbContext.Set<RowNumber>().FromSql("SELECT Row_Number FROM (SELECT ROW_NUMBER() OVER(ORDER BY [Column] DESC) AS Row_Number, [Column] FROM [Table]) AS Query WHERE [Column] = {0}").ToList();

是的,这更高效,性能更高!