【问题标题】:How to get Max() with potential null?如何获得可能为 null 的 Max()?
【发布时间】:2013-10-24 18:27:56
【问题描述】:

我正在运行以下查询,但它失败并出现异常:

转换为值类型“Int32”失败,因为具体化值为 null。

var myvalue = conn.Employees.Where(r => r.LastName == LastName).Max(r1 => r1.Id);

有没有办法在一行代码中获取 Max() 并考虑空值?

【问题讨论】:

  • 属性IdNullable<int>吗?
  • @Jehof 如果不是这样,那将毫无意义。应该是 0。
  • @gleng 你怎么知道的?他的问题不清楚,对我来说,缺少给出有效答案的信息。
  • 我已经更新了我的答案@4thSpace。看看吧。
  • 1) 这是 LINQ-to-objects 吗?或者其他一些 LINQ 的味道? 2)您确定问题出在您的查询中吗?如果这是基于 IQueryable 的 LINQ 风格之一,则问题可能是由您的类与数据库不匹配引起的。例如,数据库可能包含null,但Id 是不可为空的属性。

标签: .net linq c#-4.0


【解决方案1】:

假设 Id 可以为空,则使用合并 或扩展 where 条件:

// Coallesce- probably not the best thing here
var myvalue = conn.Employees.Where(r => r.LastName == LastName).Max(r1 => r1.Id ?? 0);

// Expanded where-condition
var myvalue = conn.Employees.Where(r => r!= null && r.Id!=null && r.LastName == LastName).Max(r1 => r1.Id);

请注意,myvalue 也可以为 null。 所以如果你这样做:

int someInt = (int) myvalue;

你显然会得到一个例外。

所以修复可能是:

int someInt =(int) ( myvalue ?? 0 );

【讨论】:

  • 那么它不是导致错误的 linq-expression,或者您没有在问题中提供足够的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2022-11-03
  • 2019-08-12
  • 2013-04-24
  • 1970-01-01
相关资源
最近更新 更多