我无论如何都不是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));
这显然会返回一个空白而不是列表...... 这个:
var existingKeys = request.Keys.Select(taskKey =>
_context.WebTaskGroups
.Where(x => x.TaskGroupNameKey == key && x.TaskKey == taskKey)
.Select(keys => keys.TaskGroupNameKey));
给我一个&#34; IEnumerable&lt; IQueryable&lt; int&gt;&gt;。那么我在这里失踪的秘诀是什么?
答案 0 :(得分:6)
您不应该首先执行N个数据库查询。使用LINQ执行那些N个查询而不是foreach
循环并不能解决这个核心问题。
您需要重新构思查询,以便只有一个查询可以获取所需的所有数据。在这种情况下,这意味着获取与集合密钥匹配的所有项目,而不是尝试匹配单个密钥,然后执行N个查询。
var requestedKeys = request.Keys;
var existingKeys = _context.WebTaskGroups
.Where(x => x.TaskGroupNameKey == key &&
requestedKeys.Contains(x.TaskKey))
.Select(x => x.TaskGroupNameKey))
.ToList();
答案 1 :(得分:1)
var existingKeys = request
.SelectMany(r => r.Keys)
.SelectMany(tk =>
_context.WebTaskGroups
.Where(x.TaskGroupNameKey == key && x.TaskKey == tk)
.Select(x => x.TaskGroupNameKey))
.ToList();
答案 2 :(得分:0)
var existingKeys = _context.WebTaskGroups
.Where(x => x.TaskGroupNameKey == key && request.Keys.Contains(x.TaskKey))
.Select(x => x.TaskGroupNameKey)
.ToList();
答案 3 :(得分:0)
ForEach返回空格:http://msdn.microsoft.com/en-us/library/bwabdf9z(v=vs.110).aspx
ForEch:对List的每个元素执行指定的操作。
那么该做什么,是对于request.Keys中的每个项目执行添加到现有键列表的操作。
例如:
request.Keys.ForEach(taskKey =>
existingKeys.AddRange(_context.WebTaskGroups
.Where(x => x.TaskGroupNameKey == key && x.TaskKey == taskKey)
.Select(x => x.TaskGroupNameKey));