C# 获取linq中的最后一行

C# 获取linq中的最后一行,c#,entity-framework,linq,C#,Entity Framework,Linq,我有1个表的PK是字符串,我无法获取最后一行 当我使用order by code desc 9999不正确 73858是正确的 请帮帮我 我来自泰国,如果语言不正确,很抱歉 ======================================================================= 非常感谢你,这个问题已经解决了 var lastrow=db.table.OrderByDescending(x=>x.Code.Length)。然后是ByDescending(

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

9999不正确

73858是正确的

请帮帮我

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

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


var lastrow=db.table.OrderByDescending(x=>x.Code.Length)。然后是ByDescending(x=>x.Code)。FirstOrDefault().Code

由于您的
code
-属性是字符串,因此使用字符串算法比较值,其中
9999
大于
73858
,因为它以
9
开头。您需要的是数字算术,所以首先将字符串转换为数字。不幸的是,您不能在EF中使用
int.TryParse
Convert.ToInt32
,因此您必须首先将查询转换为
IEnumerable

var query = myQuery.AsEnumerable();
现在您可以转换每个字符串并获得实际的最后一行

var lastRow = query.OrderByDescending(o => Convert.ToInt32(o.Code)).FirstOrDefault().Code
这意味着您必须将所有数据存储到内存中,以便获得最大的值,当您有许多行时,这可能是一个问题


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

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

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

db.Entries
    .OrderByDescending(x => x.Code.Length)
    .ThenByDescending(x => x.Code)
    .FirstOrDefault();
或者在SQL中,通过排序将最高的代码放在前面

order by LEN(code) desc, code desc

我没看到林克。将代码显示为文本而不是图片。“最后一行是9999,但实际的最后一行是73858”,那么哪一行是预期的最后一行?如果您的代码是数字的,并且应该以这种方式排序,则不应该将其提取/存储为字符串。当
9999
是最大/最后一行时,则表示您比较/排序字符串,not numbersvar lastrow=db.C_ACTIVEL.OrderByDescending(o=>o.Code).FirstOrDefault().Code;//代码是stringYou看到您的方法是相当有问题的,这就是为什么用户建议对您的数据库使用int类型。否则,您将不得不转换客户端的值,正如我allready所说,这是非常低效的。这是SAP数据库,我不知道为什么SAP会将其生成为stringbea,因为无论是谁设置的,它都是一个字符串。SAP支持int列。这是SAP数据库,我不知道SAP为什么生成此列string@otaroo如果它解决了你的问题,你应该把它标记为答案。关于编辑的注意事项:如果只需要代码,最好选择(x=>x.code).FirstOrDefault()而不是
.FirstOrDefault().code
。您的版本将使空表上的程序崩溃。谢谢您的建议^_^