Как обработать деление на ноль в Linq - PullRequest
1 голос
/ 27 апреля 2011

В следующем запросе linq у меня есть исключение деления на ноль, которое я не могу кодировать вокруг. Это происходит, когда сумма fldDevider возвращает 0.

Dim lstToReturn As List(Of MonthData)

lstToReturn = (
 From myRow In dtSpotData.AsEnumerable()
 Group myRow By myRow.Field(Of DateTime)(fldstartdate).Month Into Group
 Select New MonthData() With {
 .Month = Month,
 .ValuePerMonth =
 (
  Group.Sum(Function(dr) dr.Field(Of [Decimal])(fldSomeGeneralValue)) /
  (
   Group.Sum(Function(dr) CDec(dr.Field(Of String)(fldDevider)))
  )
 )
 }
).ToList()

Как я могу убедиться, что поле ValuePerMonth равно 0, когда функция Group.Sum (Function (dr) CDec (dr.Field (Of String) (fldDevider)))) возвращает 0. Или как мне вернуть 1 для Суммируйте fldDevider, если это на самом деле 0.

Приветствуются также некоторые советы о том, как лучше преобразовывать строки в десятичные.

1 Ответ

3 голосов
/ 27 апреля 2011

Я привык к синтаксису C #, но я использовал бы 'let', чтобы захватить значение делительного числа и использовать его, только если оно больше нуля, а в противном случае использовать 1.

Dim lstToReturn As List(Of MonthData)

lstToReturn = (
 From myRow In dtSpotData.AsEnumerable()
 Group myRow By myRow.Field(Of DateTime)(fldstartdate).Month Into Group
 Let div = Group.Sum(Function(dr) CDec(dr.Field(Of String)(fldDevider)))
 Select New MonthData() With {
 .Month = Month,
 .ValuePerMonth =
 (
  Group.Sum(Function(dr) dr.Field(Of [Decimal])(fldSomeGeneralValue)) / If(div > 0, div, 1)
 )
 }
).ToList()
...