我想将此foreach循环转换为LINQ语句

时间:2014-07-25 15:27:33

标签: c# linq entity-framework

我无论如何都不是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;。那么我在这里失踪的秘诀是什么?

4 个答案:

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