2014-11-06 39 views
0

我正在捕获DbEntityValidationException,并且想要填充包含所有错误的Dictionary。目前我正在做以下事情:将嵌套循环更改为Linq

foreach (var entity in errors) 
{ 
    foreach (var error in entity.ValidationErrors) 
    { 
     validationErrors.Add(entity.Entry.Entity.GetType().FullName + "." + error.PropertyName, 
          error.ErrorMessage) 
    } 
} 

是否有可能将上述循环转换为linq语句?

回答

0

我不会改变它,因为内部方法有副作用,不应该进入linq语句。所以唯一的可能是两个可以压缩的每个循环。但是由于你在最内部的方法中访问了两个循环变量(实体和错误),你可以创建一个中间匿名对象来保存这两个变量。

所以(恕我直言)在这种情况下,linq挂件将比这个简单的两个堆叠for循环更难以阅读。

var items = errors.SelectMany(entity => entity.Select(error => new { Entity = entity, Error = error })); 

foreach(var item in items) 
{ 
    validationErrors.Add(
     item.Entity.Entry.Entity.GetType().FullName 
      + "." 
      + item.Error.PropertyName, 
     errorMessage); 
} 
0

粗略地(freehanding):

var errorsAsDict = (from entity in errors 
        from error in entity.ValidationErrors 
        select new { Entity = entity, Error = error}) 
       .ToDictionary(
        key => key.entity.Entry.Entity.GetType().FullName + "." + key.Error.PropertyName, 
        value => value.Error.ErrorMessage); 

如果做了一个错字不发表评论,我会解决它。

这创建了一个新的字典,其中包含您的错误,但我没有看到您想如何使用它,最终用途是什么,也许有更好的方法?

+0

你的钥匙是指错误不是实体 – 2014-11-06 08:34:07

+0

此外,你有因为使用绑定变量“错误”的初始集合冲突格兰名字笔误,应该是错误的 – Georg 2014-11-06 08:35:54

+0

@ Selman22良好的捕获,修复它。 – flindeberg 2014-11-06 08:37:13

0

另一种方法:

var dict = 
    errors.SelectMany(
     entity => entity.ValidationErrors, 
     (entity, error) => new { entity = entity, verror = error } 
    ).ToDictionary(
     e => e.entity.Entry.Entity.GetType().FullName + "." + e.verror.PropertyName, 
     e => e.verror.ErrorMessage 
    ); 
+1

这不是另一种方法。它只是使用扩展方法语法编写的flindeberg代码。 – Oliver 2014-11-06 09:42:29

+0

你说得对@Oliver。也许是因为我更习惯这种语法。 – 7affer 2014-11-06 09:52:50

+0

我也是,但它只是一个代码克隆。 – Oliver 2014-11-06 10:19:11