C# 使用LINQ Average()方法处理空结果

C# 使用LINQ Average()方法处理空结果,c#,.net,linq,C#,.net,Linq,我是新手,正在尝试从表格到图形创建一些数据点。此表中的三个重要字段是id、时间和值。我正在编写一个查询,以获取所选id在设定时间内的平均值。我编写的LINQ如下: var value = (from t in _table where t.Id == id && t.Time >= intervalStartTime && t.Time <= interval

我是新手,正在尝试从表格到图形创建一些数据点。此表中的三个重要字段是id、时间和值。我正在编写一个查询,以获取所选id在设定时间内的平均值。我编写的LINQ如下:

var value = (from t in _table
             where t.Id == id
                 && t.Time >= intervalStartTime
                 && t.Time <= intervalEndTime
             select t.Value).Average();
编辑:完成更改:)

好的,这个怎么样:

var value = (from t in _table
             where t.Id == id
                 && t.Time >= intervalStartTime
                 && t.Time <= intervalEndTime
             select t.Value).DefaultIfEmpty().Average()
var值=(来自表中的t
其中t.Id==Id
&&t.时间>=间隔开始时间
&&t.时间编辑:全部返工

首先尝试将该值强制转换为null

var value = (from t in _table
         where t.Id == id
             && t.Time >= intervalStartTime
             && t.Time <= intervalEndTime
         select ((int?)t.Value) ?? 0).Average()
var值=(来自表中的t
其中t.Id==Id
&&t.时间>=间隔开始时间

&&t.Time尝试以下操作。它将跳过查询返回的所有空项

var value = (from t in _table
             where t != null
             where t.Id == id
                 && t.Time >= intervalStartTime
                 && t.Time <= intervalEndTime
             select t.Value).Average();
var值=(来自表中的t
其中t!=null
其中t.Id==Id
&&t.时间>=间隔开始时间
&&t.时间=间隔开始时间

&&t.时间您可以使用临时值进行初始查询吗

例如:

var temp=(来自表中的t
其中t.Id==Id
&&t.时间>=间隔开始时间
&&时间我想你想要

var value = (from t in _table
             where t.Id == id
                && t.Time >= intervalStartTime
                && t.Time <= intervalEndTime
             select (int?)t.Value).Average()
现在,要获得0而不是null的平均值,需要将coalescing操作符放在末尾

var value = (from t in _table
             where t.Id == id
                && t.Time >= intervalStartTime
                && t.Time <= intervalEndTime
             select (int?)t.Value).Average() ?? 0.0;
var值=(来自表中的t
其中t.Id==Id
&&t.时间>=间隔开始时间

&&t.时间选择t.值??0不作为t进行编译。值是不可为空的int。是的,编译器告诉我,左操作数永远不会为空,因为值不可为空。您确定有括号等吗?正确吗?强制转换为可为空是合法的,所以值应该已经计算过了…如何
t
为空,以及介于
inter之间valStartTime
intervalEndTime
?我认为他的问题在于某些开始时间和结束时间之间没有记录,而不是表中有空值。哦,t.值vs.t.时间-我明白了。谢谢你的建议,但仍然抛出相同的异常。@Dominic:第一个示例不应该通过任何例外。我现在更新了t第二个示例修复了它(事实上,它是不完整的)。很抱歉,再次尝试了这两种方法。它们仍然抛出“无法将null值分配给类型为System.Decimal的成员,这是一种不可为null值的类型…”例外,但仍然没有乐趣。抛出“无法将节点“OptionalValue”格式化为SQL执行。“+1 DefaultIfEmpty()解决了如果linq的where部分将集合减少为无行时该怎么办的问题,只是为了帮助其他人解决这个问题:如果查询不返回任何行,则没有什么真正的帮助。您只需完全避免运行查询。至少这是我的经验。@horace:那根本不是真的。平均值、最小值、最大值、当只要聚合结果可为null,查询就不匹配任何行。正如您在上面的查询中所看到的,当要聚合的表达式不是可为null的类型时,您将需要强制转换来强制可为null。(在极少数情况下,它仍然不起作用,您可能正在与一个不可靠的LINQ提供商打交道。这不是LINQ的错,据我所知,没有一个提供商会如此糟糕。)
var temp = (from t in _table
            where t.Id == id
                && t.Time >= intervalStartTime
                && t.Time <= intervalEndTime
            select t.Value) ??  new List<int>() {0};
var value = temp.Average();
var value = (from t in _table
             where t.Id == id
                && t.Time >= intervalStartTime
                && t.Time <= intervalEndTime
             select (int?)t.Value).Average()
double Enumerable.Average(IEnumerable<int> source)
double? Enumerable.Average(IEnumerable<int?> source)
var value = (from t in _table
             where t.Id == id
                && t.Time >= intervalStartTime
                && t.Time <= intervalEndTime
             select (int?)t.Value).Average() ?? 0.0;