【问题标题】:get last row in linq获取 linq 中的最后一行
【发布时间】:2016-12-06 10:26:17
【问题描述】:

我有 1 个表,其中 PK 是字符串,我无法获取最后一行 当我使用order by code desc

9999不正确

73858是正确的

请帮帮我T__T

我来自泰国,如果语言不正确,请见谅

================================================ ========================= 这个问题已经grek40解决了,非常感谢

var lastrow = db.table.OrderByDescending(x => x.Code.Length).ThenByDescending(x => x.Code).FirstOrDefault().Code;

【问题讨论】:

  • 我没有看到任何 linq。将您的代码显示为文本而不是图片。
  • "最后一行是 9999,但真正的最后一行是 73858",那么预期的最后一行是哪一行?
  • 如果您的代码是数字的并且应该以这种方式排序,那么您不应该将其作为字符串获取/存储。
  • 9999 是最大/最后的这意味着您比较/排序字符串,而不是数字
  • var lastrow = db.C_ACTIVEL.OrderByDescending(o => o.Code).FirstOrDefault().Code; // 代码是字符串

标签: c# entity-framework linq


【解决方案1】:

由于您的Code-property 是一个字符串值,因此使用字符串算术比较,其中9999 大于73858,因为它以9 开头。你想要的是数字算术,所以首先将你的字符串转换为数字。不幸的是,您不能在 EF 中使用 int.TryParseConvert.ToInt32,因此您必须先将查询转换为 IEnumerable

var query = myQuery.AsEnumerable();

现在您可以转换每个字符串并获取实际的最后一行

var lastRow = query.OrderByDescending(o => Convert.ToInt32(o.Code)).FirstOrDefault().Code

这意味着您必须将所有数据放入内存中才能获得最大值,这在您有很多行时可能会成为问题。

无论如何,正如其他人已经指出的那样,您应该考虑使用允许这种搜索行为的数据类型。然后,您可以从一开始就轻松避免这些情况。

【讨论】:

  • 你看到你的方法有很多问题,这就是为什么用户建议你的数据库使用 int 类型。否则,您必须在客户端转换值,正如我已经说过的那样,这是非常低效的。
  • 它是 SAP 数据库我不知道为什么 SAP 将其生成为字符串
  • 因为设置它的人将它变成了一个字符串。 SAP 支持 int 列。
【解决方案2】:

最好的解决方案是在 DB 中使用正确的类型,即如果 Code 实际上是 Int 为什么它存储为 String?作为一种解决方法,您可以按 Convert.ToInt32(code) 排序。

【讨论】:

  • 它是 SAP 数据库我不知道为什么 SAP 将其生成为字符串
【解决方案3】:

如果您的字符串至少格式正确(周围没有空格),您可以尝试首先获取最长的代码,然后从最长的代码中获取最大的代码。

db.Entries
    .OrderByDescending(x => x.Code.Length)
    .ThenByDescending(x => x.Code)
    .FirstOrDefault();

或者在 SQL 中将最高的代码放在前面并进行排序

order by LEN(code) desc, code desc

【讨论】:

  • @otaroo 如果它解决了您的问题,您应该将其标记为答案。关于您的编辑的注释:如果您只想要代码,最好使用.Select(x => x.Code).FirstOrDefault() 而不是.FirstOrDefault().Code。您的版本会使程序在空表上崩溃。
  • 感谢您的建议^_^
猜你喜欢
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多