1

我喜欢在 db 表上编写综合查询,如下所示:

Decimal sum = MyDataContext.MyTable.Where(el => el.Client == selectedClien).Sum(el => el.Value.GetValueOrDefault(0));

不幸的是,如果 where 子句根本不返回任何元素,它就会引发错误。在使用 .Sum 之前,我应该检查 .Any 是否有一些元素,但生成的代码与最初的代码相比很难看。不要认为放置一个 try/catch 块是一个好的解决方案。

您有比以下代码更好的建议吗?

if (MyDataContext.MyTable.Where(el => el.Client == selectedClien).Any())
  sum =  MyDataContext.MyTable.Where(el => el.Client == selectedClien).Sum(el => el.Value.GetValueOrDefault(0));
else sum = 0;

谢谢菲利波

经过更多调查后添加:

MyDataContext.MyTable.Where(el => el.Client == selectedClien).Sum(el => el.Value).GetValueOrDefault(0)

当集合为空时,上面的代码运行良好。我将 'GetValueOrDefault(0)' 放在 .Sum() 内的 lambda 中的原因是字段 'Value' 是 Decimal?,所以它可能为空。我还没有测试某些元素具有空值的情况。

4

2 回答 2

0

我写了一个扩展来避免这种情况。

    public static decimal? SafeSum<T>(this IEnumerable<T> source, Func<T, decimal?> selector)
    {
        try
        {
            return source.Sum(selector);
        }
        catch
        {
            /* ignore exception */
            return null;
        }
    }
于 2012-05-18T09:03:16.320 回答
0

令人惊讶的是(对我来说)我引入了一个可能的异常原因,试图让我的代码更健壮!编写健壮代码的正确方法如下:

Decimal sum = MyDataContext.MyTable.Where(el => el.Client == selectedClien).Sum(el => el.Value).GetValueOrDefault(0);

如上面的评论和 msdn 文档中所述

Enumerable.Sum<TSource> Method (IEnumerable<TSource>, Func<TSource, Nullable<Decimal>>)

对空值和空集合具有鲁棒性。GetValueOrDefault() 确保它返回一个非空的十进制。

无论如何,为什么初始代码抛出异常仍然不是很清楚。

于 2012-05-21T07:41:37.233 回答