2013-11-16 4 views

ответ

0

попробовать

decimal val=dataRow.AsEnumerable().Sum(s=>s.Field<decimal>("Quantity")??0); 
+3

Я высоко предположить, что '' поле возвратит ' decimal', который в любом случае не может быть нулевым. – user2674389

+0

@ user2674389 ссылается на ответ MichaC –

+1

Фактически. Поле («Количество») возвращает исключение синтаксического анализа, если значение столбца равно null, см. Мой «новый» ответ ... – MichaC

0

Вы могли бы сначала разобрать поле, а затем подвести :

decimal val = dataRow.AsEnumerable() 
        .Select(s => s.Field<decimal?>("Quantity")) 
        .Where(s => s != null) 
        .Sum(s => s) ?? 0.0m; 

Обратите внимание, что я использовал десятичный символ, поэтому код действительно может обрабатывать нули. Также я использовал оператор coalesce, потому что Sum вернет null, когда перечисление пусто.

0
decimal val=dataRow.AsEnumerable().Sum(s=> s["Quantity"] == DBNull.Value ? 0M : s.Field<decimal>("Quantity")); 
1

согласно документации http://msdn.microsoft.com/en-us/library/bb360891(v=vs.110).aspx расширение поля набора данных уже возвращает нуль в тех случаях, когда значение равно нулю, но он поддерживает только NULLABLE ссылочные типы. не поддерживает типы с нулевым значением, такие как десятичные? Он выдает исключение при анализе десятичной дроби.

Таким образом, вам необходимо вручную проверять поле DBNull и затем набрасывать его. Обычно он возвращает DBNull, но расширение уже обрабатывает это.

Таким образом, вы можете просто проверить на Null в выражении LinQ как этот

decimal val=dataRow.AsEnumerable().Sum(s=> s["Quantity"] == DBNull.Value ? 0M : s.Field<decimal>("Quantity")); 

, как отправленный Дмитрий Руденко

+0

Чтение спецификации, это говорит 'Кроме того, DataSet не поддерживает типы с нулевым значением. Метод Field обеспечивает поддержку для доступа к столбцам как типы с нулевым значением. '- поэтому вы не можете иметь значение« decimal »в« DataSet », но вы можете вызывать« Поле »и обрабатывать его« DBNull ». ('Если базовым значением в DataSet является DBNull.Значение, возвращаемый тип с нулевым значением будет иметь значение null.') – Rawling

+0

вправо, это имеет смысл, поэтому вы могли бы фактически проверить сумму с помощью 'Sum (s => s.Field (« Количество ») 0);' – MichaC

+0

Да, это волшебство! :) – Rawling

0

Вы можете попробовать это:

decimal val = dataRow.AsEnumerable().Sum(s => 
    { 
     var field = s.Field<object>("Quantity"); 
     return field == null ? 0 : (decimal) field; 
    }); 

, но самый простой способ это просто допускать допустимое значение десятичной величины

decimal val = dataRow.AsEnumerable().Sum(s => s.Field<decimal?>("Quantity") ?? 0); 
0

Согласно spec для Enumerable.Sum<Nullable<decimal>>,

Этот метод возвращает нуль, если источник не содержит элементов.

В результате не указаны значения null.

Таким образом, казалось бы, что все нулевые чеки, coalsesces и условными люди используют не нужны, и все, что вам нужно, это

decimal val = dataRow.AsEnumerable() 
    .Sum(s=>s.Field<decimal?>("Quantity")) 
    .Value; 
Смежные вопросы