在给定整数数组的情况下,从数据库中加载一些记录,并保持数组的顺序,而不将所有记录加载到内存中

本文关键字:加载 数组 记录 顺序 内存 整数 情况下 数据库 | 更新日期: 2023-09-27 18:20:14

我有一个长度>3000的整数数组int[] ids。我想按Array.IndexOf(ids, recordId)的顺序从数据库表中获取前15条记录。

我正在做:

IQueryable<Record> records = from p in db.Records.Where(p => ids.Contains(p.Id)) 
                             select p;
records = records.ToList()
          .OrderBy(p => Array.IndexOf(ids, p.Id)).AsQueryable().Take(15);

这是非常低效的,因为有3000多条记录被加载到内存中,而我只需要15条。

有办法解决这个问题吗?非常感谢。

一些现有职位:

使用LINQ 以自定义/预定义顺序从EF数据模型加载记录

将数组连接到EF查询

在给定整数数组的情况下,从数据库中加载一些记录,并保持数组的顺序,而不将所有记录加载到内存中

你可以扭转局面。

  1. 从数组中选择id
  2. 只获取您实际需要的记录
  3. 将提取的记录投影回您的id选择/订单

像这样:

假设我有一个100张专辑id的列表。比如说,按降序排列,取其中的15个id。

var ids = Enumerable.Range(1, 100);
var subsetOfIds = ids.OrderByDescending(i => i).Take(15);
var dbresults = Albums.Where(a => subsetOfIds.Contains(a.AlbumId)).ToArray();
var results = subsetOfIds.Select(id => new { IdFromArray = id, record = dbresults.First(album => album.AlbumId == id) }).ToArray();

现在我只从数据库中提取了这15条记录,并且仍然按照我希望的顺序将它们放回。