操作实体框架以消除到数据库的往返

本文关键字:数据库 实体 框架 操作 | 更新日期: 2023-09-27 18:33:38

假设我有以下代码(我知道可以很容易地修改它以更好地执行,但它说明了我想做什么

List<Query> l = new List<Query>; 
// Query is a class that doesn't exist, it represents an EF operation
foreach (var x in Xs)
{
  Query o = { context.someEntity.Where(s=>s.Id==x.Id).First();} 
  // It wouldn't execute it, this is pseudo code for delegate/anonymous function
  l.Add(o)
}

然后将此查询列表发送到 EF,并对其进行优化,以便它执行尽可能少的往返次数。我们称之为BatchOptimizeAndRun;你会说

var results = BatchOptimizeAndRun(l);

并且知道它从架构中知道什么,它将把整个查询减少到最佳版本并执行该版本并将读取结果放在数组中。

我希望我已经准确地描述了我正在寻找的东西,更重要的是它的存在。如果我听起来像一个漫无边际的疯子,让我们假装这个问题从未存在过。

操作实体框架以消除到数据库的往返

我必须回应摩尔先生的建议,因为我也花了太长时间构造一个整体比例的 linq-to-entities 查询,只是为了发现我可以在更短的时间内创建一个更易于阅读和更快执行的存储过程。话虽如此,在你的例子中...

List<int> ids = Xs.Select(x => x.Id).ToList();
var results = context.someEntity.Where(s => ids.Contains(s.Id)).ToList();

我相信这将编译成类似的东西

SELECT
    *
FROM
    someEntity
WHERE
    Id IN (ids) --Where ids is a comma separated list of INT

这将为您提供所需的东西。