2014-10-07 5 views
0

Так у меня есть такой код:Замена Еогеасп с выражением LINQ

foreach (var optionValues in productOption.ProductOptionValues) 
{ 
    if (optionValues.ProductOptionValueID > 0) 
    { 
    unitOfWork.ProductContext.Entry(optionValues).State = EntityState.Modified; 
    } 
    else 
    { 
    unitOfWork.ProductContext.Entry(optionValues).State = EntityState.Added; 
    } 
} 

Обзор Код для этого было то, что я должен смотреть на использование LINQ, чтобы сделать это.

Может кто-нибудь указать мне ресурс, который может объяснить использование LINQ, чтобы изменить свойства объекта?

+1

Почему вы хотите, чтобы linq был isntead foreach? – Grundy

+0

Избегайте foreach, почему так? – Reniuz

+1

Я бы хотел увидеть обоснование использования LINQ здесь. LINQ является синтаксисом * запроса *, поэтому в ваших обстоятельствах это не подходит. Однако, с учетом сказанного здесь, это простой [ForEach] (http://stackoverflow.com/questions/200574/linq-equivalent-of-foreach-for-ienumerablet) расширение, которое вы могли бы использовать для этого. – James

ответ

7

LINQ предназначен для запросов. Вы - , изменяя значения, поэтому foreach здесь отлично.

8

У вас нет. Просто как тот.

Обзор кода для этого состоял в том, что я должен использовать LINQ для этого и избегать foreach.

Сообщите об этом автору обзора. Lin Q предназначено для Q данные по учету. Вы обновление данных. Оставайтесь с петлей foreach, все в порядке.

0

Единственное разумное использование LINQ здесь (и это зависит от типа ProductOptionValues) является для фильтрации результатов с помощью Where, который по существу заменяет if заявление, но это не лучше, чем ваш текущий код:

foreach (var option in productOption.ProductOptionValues.Where(x => x.ProductOptionValueID > 0) 
    unitOfWork.ProductContext.Entry(optionValues).State = EntityState.Modified; 

foreach (var option in productOption.ProductOptionValues.Where(x => x.ProductOptionValueID <= 0) 
    unitOfWork.ProductContext.Entry(optionValues).State = EntityState.Added; 
1

лучшее, что вы могли бы сделать это:

var query = 
    from optionValues in productOption.ProductOptionValues 
    select new 
    { 
     entry = unitOfWork.ProductContext.Entry(optionValues), 
     value = optionValues.ProductOptionValueID > 0 
      ? EntityState.Modified 
      : EntityState.Added 
    }; 

foreach (var x in query) 
{ 
    x.entry.State = x.value; 
} 

Но я не думаю, что это на самом деле дает вам много с точки зрения читаемости.

-1

Предполагая productOption.ProductOptionValues ​​приведен IList <>() (если это не вы, возможно, потребуется сделать .ToList() перед .ForEach), это было бы что-то вроде этого:

productOption.ProductOptionValues.ForEach(x => 
    unitOfWork.ProductContext.Entry(x).State = (
     (x.ProductOptionValueID > 0) ? EntityState.Modified : EntityState.Added) 
) 

... но я не думаю, что это действительно улучшение. Наоборот, на самом деле.

Действительно, не делайте этого.

+2

Строго говоря, это даже не LinQ, поскольку' ForEach' - это метод 'List ', а не метод расширения из' System.Linq'. – nvoigt

-1

Tricky, просто для юмора, можно несколькими способами, такими как:

var sum = productOption.ProductOptionValues.Select(
     optionValues => unitOfWork.ProductContext.Entry(optionValues).State = (optionValues.ProductOptionValueID > 0 ? EntityState.Modified : EntityState.Added).Sum(); 
0

Вы не должны использовать расширение LINQ ForEach. Позвольте мне объяснить, почему:

LINQ foreach нарушает принципы функционального программирования, на которых основаны все другие операторы последовательности. Очевидно, что единственная цель вызова этого метода - вызвать побочные эффекты. Цель выражения - вычислить значение, а не вызывать побочный эффект. Цель заявления - вызвать побочный эффект. Сайт вызова этой вещи выглядел бы ужасно, как выражение

Вторая причина заключается в том, что использование этого добавляет к вашему коду нулевое репрезентативное значение.Это позволит вам переписать этот совершенно чистый код:

foreach (Foo foo in foos) {statement with foo; }

в этот код:

foos.ForEach ((Foo Foo) => {заявление с участием Foo;});

, который использует почти точно такие же символы в несколько ином порядке. И все же вторая версия сложнее понять, сложнее отладить и вводит семантику закрытия, тем самым потенциально изменяя сроки жизни объектов тонким образом.

Выше приведено краткое описание блога Сообщение от Эрика Липперта. Читайте полный пост here.

Что больше расширение было удалено с помощью BCL команды в Windows 8:

List.ForEach был удален в приложениях в стиле Metro. Хотя метод кажется простым, он имеет ряд потенциальных проблем, когда список получает мутацию методом, переданным в ForEach.

Вместо этого рекомендуется просто использовать цикл foreach.

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