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