我正在尝试使用以下代码从我的数据库中的字段中获取最大数字:
var bb=(from c in Office_TBLs select c.CodeNumber).Max();
当我运行查询时,我会收到结果" 999"这是错误的,因为数据库中的最大数字是1601.数据库中的数据类型是Nvarchar吗?
如何修复我的代码以获得正确的最大数量。
答案 0 :(得分:12)
"999" > "1601"
作为字符串比较 - 所以要获得结果,您需要将字符串值转换为数字。
最简单的方法是使用.Select(s => int.Parse(s)).Max())
(或.Max(s => int.Parse(s))
)代替.Max()
,最后使用常规字符串比较。
请注意,根据数据的来源,可能有更好的方法来获取整数结果(包括更改数据库中的字段类型)。在查询上使用.Select
很可能强制查询从DB返回所有行,而不是在内存中计算Max。
答案 1 :(得分:3)
由于您使用的是LINQ to SQL,因此您应该使用Convert.ToInt32
将字符串转换为数字,因此您的查询将是:
var bb =(from c in Office_TBLs select Convert.ToInt32(c.CodeNumber)).Max();
请参阅:Standard Query Operator Translation
仅在投影中支持C#强制转换。使用的演员表 其他地方没有翻译而被忽略。 除了SQL 函数名,SQL实际上只执行相当于常见的 语言运行时(CLR)转换。也就是说,SQL可以改变它的值 一种到另一种。因为那里没有等效的CLR演员 不是重新解释与另一个相同位的概念 类型。这就是C#cast仅在本地工作的原因。它不是远程的。
答案 2 :(得分:0)
试试这个
var bb=(from c in Office_TBLs select (e => e.CodeNumber).Max())
答案 3 :(得分:0)
如果您使用NVarChar
,那么您要求按字母顺序排序值。 “999”在“1601”之后出现,就像“ZZZ”在“HUGS”之后出现一样。
如果列应该只包含数值,那么最好的解决方法是将数据类型更改为更合适的选择。