2

我将一个站点ASP.NET MVC迁移到ASP.NET MVC内核,并将EF转换为EF Core。对于某些EF EF返回null,但EF Core返回0

我就与空值的请求:

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返回null。但EF Core的所有单元都为空时返回0。 如何让EF核心返回null?

+1

责怪他们:) https://data.uservoice.com/forums/72025-entity-framework-feature-suggestions/suggestions/2410716-result-of-sum -of-an-empty-set-should-be-0-rather – grek40

+0

目前没有运气,因为EF Core在内存中处理了GroupBy(所谓的客户端评估),这是LINQ To Objects'Sum'实现的已知行为。等待EF Core v.2获得*最终*固定。 –

+0

@ grek40差不多:它不是空集的总和,而是空集的总和。 'null'被丢弃,剩下的就是一个空集,但这并不是在遇到'null'时唯一可能的合理行为。 – hvd

回答

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

OP显式提到0值为当前不需要的结果。 'DefaultIfEmpty'影响是否有任何项目被返回。换句话说,这对OP来说没有任何影响。已有评论指出这一点。这仍然是事实,它仍然需要指出。 – hvd

0

如果你想以下几点:

  • 空集 - >null
  • 只有null值 - >null
  • 任何数字的组合和null值 - >号码

试试这个代码:

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