将嵌套循环更改为Linq

时间:2014-11-06 08:29:48

标签: c# linq entity-framework

我正在捕获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语句?

3 个答案:

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