繁体   English   中英

如何在LINQ to EF中针对空集合的查询合并.Max()?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM