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

标签 c# entity-framework linq

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

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/

相关文章:

c# - 如何将字符串列表序列化为 objectid 列表

c# - 首次单击异步按钮时,UI 会卡住 5 秒

c# - WPF MVVM 中的 ADO.NET Entity Framework ?

c# - ORM 存储库模式

c# - 创建包含外部变量的 LambdaExpression

c# - 如何检测集合是否包含特定类型的实例?

c# - 在 C# 中将父类转换为子类

c# - Entity Framework 中的意外行为

c# - 使用 SUM 和 ORDER BY 的 Linq 查询

sql-server - 为什么 Entity Framework 在简单地获取表行时会触发两个 SQL 查询?