【发布时间】:2014-07-25 15:27:33
【问题描述】:
无论如何,我在 linq 方面都不是很擅长,但我通常对这类问题没有意见。我想将此 foreach 语句转换为 LINQ 语句:
var existingKeys = new List<int>();
foreach (var taskKey in request.Keys)
{
existingKeys.AddRange(_context.WebTaskGroups
.Where(x => x.TaskGroupNameKey == key && x.TaskKey == taskKey)
.Select(x => x.TaskGroupNameKey));
}
我认为这样做可以:
var existingKeys = request.Keys.ForEach(taskKey => _context.WebTaskGroups
.Where(x => x.TaskGroupNameKey == key && x.TaskKey == taskKey)
.Select(x => x.TaskGroupNameKey));
这显然返回一个 void 而不是一个列表... 这个:
var existingKeys = request.Keys.Select(taskKey =>
_context.WebTaskGroups
.Where(x => x.TaskGroupNameKey == key && x.TaskKey == taskKey)
.Select(keys => keys.TaskGroupNameKey));
给我一个“IEnumerable
【问题讨论】:
-
假设您在 Visual Studio 中,Resharper(一个代码质量插件)实际上非常擅长识别可以转换为 LINQ 语句的循环。
-
将
IEnumerable<IQueryable<int>>转换为IEnumerable<int>应该可以使用SelectMany而不是第一个 Select。 -
基本上你正在执行 N 个查询,每个键一个。你不应该那样做;您应该执行 one 查询以获取您想要的所有项目。对数据库执行所有这些往返行程尤其成问题。
-
@Robert 为什么要花大量时间尝试让解决方案发挥作用,因为您知道自己将要丢掉那些工作并做一些完全不同的事情?
-
@Robert 你开始的方法已经工作了。这并不是说您没有可行的解决方案。使用 LINQ 尝试删除您所拥有的循环绝不会改变代码的语义,这纯粹是为了美观。将代码更改为执行一次查询而不是 N 实际上是一种语义更改。
标签: c# linq entity-framework