EF返回null,但EF Core返回0

时间:2017-06-13 08:49:15

标签: c# asp.net-mvc entity-framework asp.net-core-mvc entity-framework-core

我将站点ASP.NET MVC迁移到ASP.NET MVC核心,使用EF到EF Core。

我使用空值发出请求:

 var q = bd.Prod
           .Where(o => o.xxx == yyy)
           .GroupBy(o => o.sss)
           .Select(g => new
           {
               ccc = g.Key,
               vvv = g.Sum(i => i.qqq),
               bbb = g.Sum(i => i.fff),
               nnn = g.Sum(i => i.ggg),
           });

当我使用EF执行此代码时,当sum的所有单元格为空时返回null。但当所有单元格为空时,EF Core返回0。 如何使EF Core返回null?

3 个答案:

答案 0 :(得分:1)

使用DefaultIfEmpty

var q = bd.Prod
          .Where(o => o.xxx == yyy)
          .GroupBy(o => o.sss)
          .Select(g => new
          {
            ccc = g.Key,
            vvv = g.Sum(i => i.qqq),
            bbb = g.Sum(i => i.fff),
            nnn = g.Sum(i => i.ggg),
         })
          .DefaultIfEmpty(null);

答案 1 :(得分:0)

如果您需要以下内容:

  • 空集合 - > null
  • null个值 - > null
  • 数字和null值的任意组合 - >编号

试试这段代码:

items.Aggregate((int?)null, (acc, item) => acc.HasValue ? acc + item.GetValueOrDefault() : item);

答案 2 :(得分:0)

基于@grek40 对 EF Core 5.0 的回答,您可以创建一个扩展方法,以便轻松重用它

public static decimal? SumOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector)
    => (from s in source select selector(s))
       .Aggregate((decimal?)null, (acc, item) => acc.HasValue ? acc + item.GetValueOrDefault() : item);

或者如果您希望任何空值导致空值

   public static decimal? SumAllOrNull<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector)
        => (from s in source select selector(s))
           .Aggregate((decimal?)null, (acc, item) => acc.HasValue ? acc + item : item.HasValue ? item : null);

然后调用它例如

var q = bd.Prod
           .Where(o => o.xxx == yyy)
           .GroupBy(o => o.sss)
           .Select(g => new
           {
               ccc = g.Key,
               vvv = g.SumOrDefault(i => i.qqq),
               bbb = g.SumOrDefault(i => i.fff),
               nnn = g.SumAllOrNull(i => i.ggg),
           });

注意:这仅适用于 Linq-To-Objects,因此如果在 DB 查询中,您必须事先调用 .ToList() 或 AsIEnumerable,直到 EF Core 支持在 Linq-To-Sql 中执行此操作的方法