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

时间:2012-05-08 01:40:12

标签: c# .net entity-framework orm entity-framework-4.1

假设我有以下一些代码(我知道可以轻松修改以更好地执行,但它说明了我想要做的事情)

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

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

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

1 个答案:

答案 0 :(得分:2)

我必须回应摩尔先生的建议,因为我也花了太长时间构建一个单一比例的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

它将为您提供所需的信息。