【问题标题】:Using Max and receive error 'sequence contains no elements'使用 Max 并接收错误“序列不包含元素”
【发布时间】:2020-02-13 16:13:06
【问题描述】:

我正在向我的表中添加一行。其中一列 (SubjectCount) 包含一个计数值。计数值应取该列的最大值并加 1。

我添加了这段代码

s.SubjectCount = GetAll().Max(t => t.SubjectCount as int?)?? 0 + 1;

但该值始终为 1。如果我将其更改为

s.SubjectCount = GetAll().Max(t => t.SubjectCount) + 1;

如果存在现有行,但如果表/值为空,则它不会工作我收到错误“序列不包含元素”。

我搜索了错误并尝试了DefaultIfEmpty(),但这并没有解决问题(除非我的语法不正确)。

最后GetAll() 目前没有返回任何行(这是我认为问题所在),所以我知道我可以手动添加第一行,但理想情况下,如果表是空的,我想要一个具体的解决方案来解决这个问题?

【问题讨论】:

    标签: c# asp.net asp.net-mvc linq linq-to-sql


    【解决方案1】:

    这行得通吗?

    s.SubjectCount = GetAll().Max(t => t.SubjectCount as int?)?? 0;
    s.SubjectCount++;
    

    如果表中有一行或多行,您之前的实现不会加 1,这就是它总是返回 1 的原因。

    【讨论】:

    • 和作者第一次尝试有什么不同?
    • 查看更新后的答案。如果不在?? 运算符的左侧添加 1,我很确定这只是一种情况
    【解决方案2】:

    我认为最安全的方法是避免走捷径:

    var entities = GetAll();
    s.SubjectCount = (entities?.Any() == true ? entities.Max(t => t.SubjectCount) : 0) + 1;
    

    您还应该考虑直接在 SQL 中而不是在内存中执行 Max 操作。

    【讨论】:

    • 我刚看到你的答案,我会试一试,但我尝试的第一个答案确实成功了。
    猜你喜欢
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多