asp.net 即使在使用DefaultIfEmpty()和Average()时,“Sequence Contains No Sequence”

qv7cva1a  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(108)

当我试图在结果集上调用Average()时,即使我使用DefaultIfEmpty(),也会得到以下错误。

产生错误的代码:

var Test = context.FuelRecords.Select(e => (double) e.MilesDriven).DefaultIfEmpty();
Console.WriteLine(Test.GetType());
foreach (var t in Test)
{
    Console.WriteLine(t);
    Console.WriteLine(t.GetType());
}
var Test2 = context.FuelRecords.Select(e => (double)e.MilesDriven).DefaultIfEmpty().Average();

输出:

Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[System.Double]
0
System.Double
fail: Microsoft.EntityFrameworkCore.Query[10100]
      An exception occurred while iterating over the results of a query for context type 'MileageCalculator.Models.MileageContext'.
      System.InvalidOperationException: Sequence contains no elements.
         at lambda_method(Closure , QueryContext , DbDataReader , ResultContext , Int32[] , ResultCoordinator )
         at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
System.InvalidOperationException: Sequence contains no elements.
   at lambda_method(Closure , QueryContext , DbDataReader , ResultContext , Int32[] , ResultCoordinator )
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()

我不知道我错过了什么,因为我看到的每一篇与此相关的文章似乎都是通过将DefaultIfEmpty链接到Select()上来修复的。
我尝试将0指定为DefaultIfEmpty()的参数,但没有效果。看起来不管DefaultIfEmpty,Average()调用都会查看原始的select查询。

ppcbkaq5

ppcbkaq51#

你必须使用Average重载来接受可空值:

var result = context.FuelRecords
    .Select(e => (double?)e.MilesDriven).Average() ?? 0;

相关问题