【问题标题】:convert this linq expression with loop(s)用循环转换这个 linq 表达式
【发布时间】:2013-09-27 20:03:22
【问题描述】:

我正在尝试调试其他开发人员编写的代码,而 LINQ 表达式使这项任务变得很痛苦。我不知道如何调试复杂的 LINQ 表达式,所以谁能告诉我没有它们的等效代码是什么?

instanceIdList.AddRange(
  strname.Instances
    .Where(z => instancehealthList.Find(y => y.InstanceId == z.InstanceId 
                                          && y.State == "InService") != null)
    .Select(x => x.InstanceId)
    .ToList()
  .Select(instanceid => new ServerObj(servertype, instanceid))
);

这也写得好吗?一般来说,这种 LINQ 是鼓励还是反对?

【问题讨论】:

  • 我会将它分成几行以使其更易于阅读和调试,但它没有任何“错误”。
  • from x in collection .... select xcollecton.Select() 是否都是 LINQ,所以我不确定您所说的“等效代码”是什么意思。我们是在直接使用 SQL 吗?
  • 我想我不太确定每次迭代后如何调试。
  • @BradChristie For Loops 更适合我
  • 我会在 ServerObj 的构造函数中放置一个断点并从那里开始,如果这不是 Linq2Entities,您也​​可以将 Where 子句放在 { ... } 部分中,让您在其中放置断点也是。

标签: c# linq loops for-loop


【解决方案1】:

使用循环重构查询看起来像这样:

var serverObjList = new List<ServerObj>();
foreach (var inst in strname.Instances)
{
    foreach (var health in instancehealthList)
    {
        if (inst.InstanceID == health.InstanceID && health.State == "InService") 
        {
            serverObjList.Add(new ServerObj(servertype, health.InstanceID));
            break;
        }
    }
}

【讨论】:

    【解决方案2】:

    与其将其重写为一系列foreach 循环,不如在每次操作后立即执行表达式,允许您在中间步骤检查数据集,如下所示:

    List<var> soFar = strname.Instances.Where(z => instancehealthList.Find(y => y.InstanceId == z.InstanceId && y.State == "InService") != null).ToList();
    
    List<Int64> soFar2 = soFar.Select( x => x.InstanceId ).ToList();
    
    List<ServerObj> soFar3 = soFar2.Select( instanceId => new ServerObj(servertype, instanceid) ).ToList();
    
    instanceIdList.AddRange( soFar3 );
    

    当然,我觉得这个 Linq 写得不好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-19
      • 2012-08-10
      • 2013-03-05
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      • 1970-01-01
      相关资源
      最近更新 更多