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

时间:2015-11-09 14:54:31

标签: 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的返回类型被推断为.Max(),它不能被合并。

但是,如果我不使用空合并,并假设default(T)确实返回0(在这种情况下为1),那么我'对于空案例,最终会以0代替Foo。由于这是对数据库的调用,我宁愿使用一个查询。

如果我将int?上的属性设为NULL类型,它就像我想要的那样,但我不想这样做,因为我们不会这样做允许数据库中的System.IO.File.WriteAllBytes("yourfilepath.wav", Encoding.ASCII.GetBytes(somestring)); 值,然后我认为没有理由在实体上允许它们。

1 个答案:

答案 0 :(得分:3)

  

我得到的印象是.Max()如果集合结束则返回null   聚合的是空的

您收到了InvalidOperationException,其中记录了here

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

您可以使用DefaultIfEmpty(0)

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