【问题标题】:Max() in LINQ QueryLINQ 查询中的 Max()
【发布时间】:2014-12-23 19:03:58
【问题描述】:

我有一个 DataType 为 Nvarchar(max) 的列 样本记录:

Advisor_Code
9001
9002
9003
100001
100001
9011

我试过这个查询:

var code = (from a in db.advisor_Registration select a ).Max(a=>a.advisor_Code);

它返回 9011 但最大 Number 是 100001 。 如何解决它

【问题讨论】:

  • 您的列必须是整数,而不是 varchar。
  • 你没有数字,你有字符串。 9011 < 100001,但"9011" > "100001"。处理此问题的正常方法是使用正确的数据类型。大概你有一个 nvarchar 类型,因为你的一些代码不能被解释为数字,但是如果你这样做了,你想在比较中如何对待它们?
  • @hvd 我明白,但有没有这样的事情:select max(cast(advisor_code as int)) From table
  • @King_Fisher 是的,但需要明确的是,如果不能将 任何 代码转换为 int,SQL 中会严重失败。如果您的数据库中有任何此类代码,您可以接受异常吗?如果是这样,那就是值得在问题中包含的相关信息。
  • @hvd 没有机会出现该异常,因为我的表中只有上述值

标签: asp.net-mvc linq entity-framework asp.net-mvc-4


【解决方案1】:

由于其中一个标签是,我认为它应该可以翻译成SQL。如果你使用例如Convert.ToInt32 在 LINQ 语句中,这不会成功。

在不转换的情况下从字符串中获取“数字”最大值的常用方法是先按长度排序,然后按字符串排序:

var max = myquery.OrderByDescending(x => x.Length)
                 .ThenByDescending (x => x)
                 .First();

其中myquery 可以是针对返回字符串的DbSet 的任何查询。当然,如果任何字符串不是数字,结果将毫无意义。

【讨论】:

  • 还是一样的结果 9011
  • 我有这个:var code = db.advisor_Registration.OrderByDescending(x => x.advisor_Code) .ThenByDescending(x => x) .First();
  • 不一样。查看Length 部分。
  • myquery 应该返回 字符串。喜欢db.advisor_Registration.Select(x => x.advisor_Code).OrderByDescending...
【解决方案2】:

您只能对数字字段执行 MAX 函数并获得预期结果。 nvarchar(max) 不是数字字段。例如,您必须将字符串转换为长字符串,然后将 MAX 用于 MAX 以按预期工作。

【讨论】:

  • 您显然可以对字符串字段执行最大值。 OP 正在这样做,并得到了结果。这不是 OP 所期望的结果。
  • 我会改写我的答案,这样你抽搐的投反对票的手指就会开心。
  • 那么它仍然不一定是一个有用的答案。如果任何字符串都不能被解析为数字,它将失败得相当严重。 (这就是为什么我评论了问题请求澄清,而不是发布答案,顺便说一句。)
  • 如何在这个查询中将字符串转换为 Long ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
相关资源
最近更新 更多