2014-11-06 3 views
0

Я поймаю исключение DbEntityValidationException и хочу заполнить словарь всеми ошибками. В настоящее время я делаю следующее:Изменение вложенного цикла в 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. Так что единственное, что было бы для каждой петли, которая могла бы быть уплотнена. Но из-за того, что вы в своем самом внутреннем методе обращаетесь к обоим переменным цикла (сущность и ошибка), вы должны создать промежуточный анонимный объект, который будет содержать оба.

Итак, (IMHO) в этом случае подвеска linq будет сложнее читать, чем эти простые два штабелированных цикла.

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

ключ относится к ошибке не объект –

+0

Кроме того, у вас есть опечатка поскольку Teh имени ваших первоначальных столкновений коллекции с связанными переменным «ошибкой», должен быть ошибками – Georg

+0

@ Selman22 Хороший улов, исправил его. – flindeberg

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

+0

Ты прав @ Оливер. Может быть, потому, что я больше привык к этому синтаксису. – 7affer

+0

Я тоже, но, тем не менее, это просто клонирование кода. – Oliver

Смежные вопросы