我的模型中有一个具有整数属性的实体:
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));
值,然后我认为没有理由在实体上允许它们。
答案 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();