在EF中,当必须处理索引时,我们需要将实体集合转换为列表IQueryable
或IEnumerable
不实现任何索引器(由于延迟执行,它将毫无意义机制)。当使用ToList
使用索引的相当大的集合时,会很重。
这就是为什么我有时需要按行号(而不是标识/主键)查找实体。例如,我有一条记录,我想得到它的行号(在排序表中的位置)并得到下一条记录。
这可以在实体框架中实现吗?我可以发送SQL查询来执行此操作,但我很好奇是否有Linqish和EF特定的方法来执行此操作。
答案 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();
是的,这更高效,性能更高!