我正在捕获DbEntityValidationException,我想填充包含所有错误的Dictionary。目前我正在做以下事情:
foreach (var entity in errors)
{
foreach (var error in entity.ValidationErrors)
{
validationErrors.Add(entity.Entry.Entity.GetType().FullName + "." + error.PropertyName,
error.ErrorMessage)
}
}
是否可以将上述循环更改为linq语句?
答案 0 :(得分: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);
如果一个拼写错误做评论,我会解决它。
这会创建一个包含错误的新字典,但我看不出你想如何使用它,最终用途是什么,也许有更好的方法?
答案 1 :(得分: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);
}
答案 2 :(得分: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
);