【问题标题】:Load a few records from database given an array of integers and keep the order as the array without loading all records to memory给定一个整数数组,从数据库中加载一些记录,并将顺序保持为数组,而不将所有记录加载到内存中
【发布时间】:2013-06-27 01:12:45
【问题描述】:

我有一个长度 > 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 条。

有没有办法解决这个问题?谢谢。

一些现有的帖子:

Load Records From EF Data Model in Custom/Predefined Order Using LINQ

Join array to EF query

【问题讨论】:

  • ids 中的项目是否已经按某种排序顺序排列?将记录 ID 升序或降序排序是一种选择吗?
  • @triad_Mike:不是 ids 中的项目是从我使用的搜索引擎工具中随机获得的。 :(
  • 能否保证该查询一次只运行一次?
  • @SimonBelanger:对于 Web 项目中的每个请求,查询只会运行一次。

标签: c# sql-server entity-framework linq-to-entities


【解决方案1】:

你可以把它转过来。

  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 条记录,并且仍然按照我希望它们的顺序返回它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2019-07-12
    • 2023-02-16
    • 2013-04-21
    相关资源
    最近更新 更多