gpt4 book ai didi

c# - 如何合并 .Max() 以查询 LINQ to EF 中的空集合?

转载 作者:太空宇宙 更新时间:2023-11-03 23:26:38 25 4
gpt4 key购买 nike

我的模型中有一个具有整数属性的实体:

public class Foo
{
public int SortOrder { get; set; }

// ...other props
}

现在,对于数据库中所有 Foo 的某些子集,我想选择最高的 SortOrder 并添加一个 - 即获取新的排序顺序最后添加到集合中的对象 - 但如果该子集中没有 Foo,我想以 0 结尾 - 即添加到空集合中的新对象的排序顺序。

阅读 this reference page ,我得到的印象是,如果它聚合的集合为空,则 .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? 类型,它会按照我想要的方式工作,但我不想这样做,因为我们不允许在数据库中使用 NULL 值,我认为没有理由在实体上允许它们。

最佳答案

I got the impression that .Max() returns null if the collection over which it aggregates is empty

您得到一个 InvalidOperationException 记录在案 here

“InvalidOperationException...源不包含任何元素。”

您可以使用 DefaultIfEmpty(0) :

int maxSortOrder = context.Foos
.Where(/* predicate for subset */)
.Select(foo => foo.SortOrder + 1)
.DefaultIfEmpty(0)
.Max();

关于c# - 如何合并 .Max() 以查询 LINQ to EF 中的空集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33611831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com