我将站点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?
答案 0 :(得分:1)
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 中执行此操作的方法