获得linq的最后一行

时间:2016-12-02 10:16:41

标签: c# entity-framework linq

我有一张桌子,PK是字符串我不能得到最后一行 当我使用order by code desc

9999 不正确

enter image description here

73858 是正确的

enter image description here

请帮助我T__T

我来自泰国抱歉,如果语言不正确

=============================================== ======================== 这个问题由grek40解决了。非常感谢

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

3 个答案:

答案 0 :(得分:1)

由于您的Code - 属性是字符串值,因此使用字符串算术比较9999更大73858,因为它始于9。你想要的是数字算术,所以首先将你的字符串转换为数字。遗憾的是,您无法在EF中使用int.TryParseConvert.ToInt32,因此您首先要坚持将查询转换为IEnumerable

var query = myQuery.AsEnumerable();

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

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

这意味着你必须将所有数据都存入内存才能获得最大的价值,当你有很多行时可能会出现问题。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

或者在SQL中使用排序

将最高代码带到前面
order by LEN(code) desc, code desc