[英]How do I coalesce .Max() for queries against empty collections in LINQ to EF?
我的模型中有一个实体,它有一个整数属性:
public class Foo
{
public int SortOrder { get; set; }
// ...other props
}
现在,对于数据库中所有Foo
的某个子集,我想选择最高的SortOrder
并添加一个 - 即获取最后添加到集合中的新对象的排序顺序 - 但是如果该子集中没有Foo
,我想最终得到0 - 即添加到空集合的新对象的排序顺序。
阅读这个参考页面 ,我得到的印象是.Max()
如果它聚合的集合是空的,则返回null
,所以我尝试了以下内容:
var sortOrder = context.Foos
.Where(/* predicate for subset */)
.Max(foo => foo.SortOrder) + 1
?? 0;
但是这不会编译,因为.Max
的返回类型被推断为int
,不能为null合并。
但是,如果我只是不使用null合并,并假设.Max()
确实返回default(T)
(在这种情况下为0
),那么对于空案例,我将以1
而不是0
结束。 由于这是对数据库的调用,我宁愿使用一个查询。
如果我让Foo
上的属性为int?
类型,它就像我想要的那样工作int?
,但我不想这样做,因为我们不允许数据库中的NULL
值,我认为没有理由在实体上允许它们。
我得到的印象是.Max()如果聚合的集合为空,则返回null
您将获得InvalidOperationException
, 此处将对此进行说明
“InvalidOperationException ... source不包含任何元素。”
您可以使用DefaultIfEmpty(0)
:
int maxSortOrder = context.Foos
.Where(/* predicate for subset */)
.Select(foo => foo.SortOrder + 1)
.DefaultIfEmpty(0)
.Max();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.