Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按行号查找实体_C#_Entity Framework_Entity Framework Core - Fatal编程技术网

C# 按行号查找实体

C# 按行号查找实体,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,在EF中,当必须处理索引时,我们需要将实体集合转换为一个列表,因为IQueryable或IEnumerable不实现任何索引器(由于延迟执行机制,这将毫无意义)。当拥有一个相当大的集合时,使用ToList来使用索引将是非常沉重的 这就是为什么我有时需要按行号(而不是标识/主键)查找实体的原因。例如,我有一条记录,我想得到它的行号(在排序表中的位置),然后得到下一条记录 这可以在实体框架中实现吗?我可以发送SQL查询来实现这一点,但我很好奇是否有Linqish和EF特定的方法来实现这一点 这可以通

在EF中,当必须处理索引时,我们需要将实体集合转换为一个列表,因为
IQueryable
IEnumerable
不实现任何索引器(由于延迟执行机制,这将毫无意义)。当拥有一个相当大的集合时,使用
ToList
来使用索引将是非常沉重的

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


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

这可以通过调整DbContex并添加与行号对应的伪实体来实现。可以利用此实体在SQL中使用内置的
ROW\u 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);
        });
 ...
}
公共虚拟数据库集行数{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity(x=>{
x、 HasKey(e=>e.Row_编号);
});
...
}
现在我们可以进行以下查询:

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();
var rowNumber=dbContext.Set().FromSql(“选择行号FROM(选择行号()OVER(按[Column]DESC排序)作为行号,[Column]FROM[Table])作为查询,其中[Column]={0}”).ToList();

是的,这是更有效和更高的性能

你曾尝试过<代码> EntEngTyter()/Case>方法和这个链接:?@ TIM.TAN:这是一个远离主题的方式。如果你有大的列表,需要按行号查找,那么考虑在查询中使用Skip/Apple。你的例子是“代码> EF 6 < /COD>或<代码> EF核心< /代码>?