如何在LINQ中表达这个嵌套循环?

iqxoj9l9  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(116)

背景:

  • 我有ASP.NET核心应用程序。我正在尝试将服务器端验证错误写入日志。
  • 如果ASP.NET核心模型验证在Web窗体的任何字段中检测到任何错误,则ModelState.IsValid为false。
  • web表单中的每个字段都列在ModelState.Values
  • 如果“值”有一个或多个错误,则值.错误.计数〉0
  • 我想记录a)网页表单字段名称(值的“键”)和b)该字段的每个错误消息。
  • 我希望将所有这些信息包含在一行中(即一个C#“字符串”)。
    当前代码:
// LOG:
//   2022-10-24 09:37:29.0909|Error|ServiceMenu.Q255: The value '' is invalid. 
//   2022-10-24 09:37:35.4096|Error|ServiceMenu.Q265: The value '' is invalid. 
if (!ModelState.IsValid)
{
    foreach (var k in ModelState.Keys)
    {
        var v = ModelState[k];
        if (v.Errors.Count > 0)
        {
            string s = k + ": ";
            for (int i=0; i < v.Errors.Count - 1; i++)
                s += v.Errors[i].ErrorMessage + ", ";
            s += v.Errors[v.Errors.Count - 1].ErrorMessage;
            _logger.LogError(s);
        }
    }
    return Page();
}

输出示例(两个必填字段Q255和265为空):

2022-10-24 09:37:29.0909|Error|ServiceMenu.Q255: The value '' is invalid. 
2022-10-24 09:37:35.4096|Error|ServiceMenu.Q265: The value '' is invalid.

问:我可以用LINQ简化这个嵌套循环吗?

更新日期:

  • 谢谢大家
  • Evk和T.S.都是绝对正确的:* “不要认为使用LINQ总是好的。"* 我不这么认为-他们的观点很好地被接受了:)
  • 奥利弗Weichhold给了我我要找的语法:)
  • 下面是我最终得到的代码:
// EXAMPLE LOG:
//   2022-10-24 13:24:10.5242|Error|ServiceMenu.Q255: The value '' is invalid. 
//   2022-10-24 13:24:24.9692|Error|ServiceMenu.Q265: The value '' is invalid. 
if (!ModelState.IsValid)
{
    foreach (var k in ModelState.Keys)
    {
        var v = ModelState[k];
        if (v.Errors.Count > 0)
        {
            string s = string.Join(", ", ModelState[k].Errors
                .Select(x => x.ErrorMessage));
            _logger.LogError(k + ": " + s);
        }
    }
    ...
zpqajqem

zpqajqem1#

if (!ModelState.IsValid)
{
    var logMessage = string.Join("\n", ModelState.Keys
        .Where(x => ModelState[x].Errors?.Count > 0)
        .Select(x => $"{x}: " + string.Join(", ", ModelState[x].Errors.Select(y => y.ErrorMessage))));
        
    _logger.LogError(logMessage);
}

相关问题