0

假设我有以下代码(我知道可以很容易地对其进行修改以获得更好的性能,但它说明了我想要做什么)

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);

并且知道它从模式中知道什么,它会将整体查询减少到最佳版本并执行该版本并将读取结果放入数组中。

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

4

1 回答 1

2

我不得不回应 Moore 先生的建议,因为我也花了太长时间构建一个整体比例的 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

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

于 2012-05-08T02:35:21.133 回答