【问题标题】:C# Entity Framework select max after where filter of not nullable fieldC#实体框架在不可为空字段的过滤器之后选择最大值
【发布时间】:2016-05-13 19:16:57
【问题描述】:

我有一个不可为空的字段 (Num)

class MyTable
{
    //...
    public int Num { get; set; }
    public string Category { get; set; }
    //...
}

想为Category == "A"找到最大的Num

var maxnum = myTable
   .Where(r => r.Category == "A")
   .Max(r => r.Num);

当没有category == "A" 的任何记录时出现问题。因为Where() 的结果为空,所以Max() 的结果将为空,但当Num 不可为空时,就会发生异常。

我可以通过在表格设计中将Num 设置为可为空来修复它,但我不喜欢这种解决方案,而Num 应该具有价值且不应为空。

有什么建议吗?有没有办法在 Num 不可为空时接受 Num 的空值?或任何更好的查询?

【问题讨论】:

  • 因此,如果查询的Where.(r => r.Category.Equals("A") 部分为空,并且Num 不可为空,我希望它会给您一个例外,因为没有Num 的记录,其中@ 987654336@?所以看看DefaultIfEmpty

标签: c# entity-framework max where nullable


【解决方案1】:
int maxShoeSize = Workers.Where(x => x.CompanyId == 8)
                     .Select(x => x.ShoeSize)
                     .DefaultIfEmpty(0)
                     .Max();

见:Max return value if empty query

【讨论】:

  • OK 重复问题!虽然我在搜索中找不到该问题,但无论如何我为该问题添加了一些标签可能有助于以后更好的搜索结果。
【解决方案2】:

有没有办法在 Num 不可为空时接受 Num 的空值?

当然可以:

//...
.Max(r => (int?)r.Num);

每个不可为空的值都可以变成可空的(但反之不行)。我个人更喜欢这种方法(实际上是在异常消息中建议的),因为它允许我区分无最大值和最大值 0(零)甚至 int.MinValue

【讨论】:

  • UP 回答额外的问题。我认为 DefaultIfEmpty 是此类问题的更好解决方案,但正如您所建议的那样,如果我们不希望将 0 设为空,那会更好。
【解决方案3】:

你可以试试:

var maxnum = myTable
   .Where(r => r.Category == "A")
   .Max(r => r.Num) ?? 0;

然后您可以使用 0 结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多