Попробуйте написать метод расширения утилиты, который преобразует XElement в десятичную.В этом случае вы можете рассматривать недесятичные значения как ноль, так как вас интересуют только положительные значения.Если вы хотите провести различие между действительным значением 0 и недесятичным значением, то метод может возвратить нулевое десятичное значение.
public static class UtilityExtensions {
// return decimal? to differentiate between real zero and non-decimal values
public static decimal ToDecimal(this XElement element){
if(element == null || element.IsEmpty) return 0; // return null for decimal?
decimal value;
// if you can use C# 7, code can be more succinct with inline declaration
return Decimal.TryParse(element.Value, out value) ? value : 0; // return null instead of 0 for decimal?
}
}
Теперь ваш LINQ намного проще.Это также будет обрабатывать случай, когда отсутствует сам элемент «balance».
var resultsWithPositiveBalance = xml.Descendants("Invoice")
.Where(x => !x.Element("balance").ToDecimal() > 0);
В случае, если вы в конечном итоге используете decimal?
версию:
var resultsWithPositiveBalance = xml.Descendants("Invoice")
.Where(x => (!x.Element("balance").ToDecimal() ?? 0 ) > 0);