0

我正在尝试使用以下代码从数据库中的字段中获取最大数字:

var bb=(from c in Office_TBLs select c.CodeNumber).Max();

当我运行查询时,我收到错误的结果“999”,因为数据库中的最大数字是 1601。数据库字段中的 Nvarchar 数据类型是否重要?

我怎样才能修复我的代码以获得正确的最大数量。

4

4 回答 4

12

"999" > "1601"作为字符串比较 - 因此要获得您想要的结果,您需要将字符串值转换为数字。

最简单的方法是使用.Select(s => int.Parse(s)).Max())(or .Max(s => int.Parse(s))) 而不是.Max()最终使用常规字符串比较。

请注意,根据数据的来源,可能会有更好的方法来获取整数结果(包括更改数据库中的字段类型)。使用.Selecton query 很可能会强制查询从 DB 返回所有行,并且仅在内存中计算 Max。

于 2013-05-03T04:40:34.220 回答
3

由于您使用的是 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# 强制转换只能在本地工作的原因。它不是远程的。

于 2013-05-03T04:46:48.217 回答
0

尝试这个

var bb=(from c in Office_TBLs select (e => e.CodeNumber).Max())
于 2013-05-03T04:42:32.580 回答
0

如果您使用NVarChar,那么您要求将值按字母顺序排序。“999”在“1601”之后,就像“ZZZ”在“HUGS”之后一样。

如果该列应该只包含数值,那么最好的解决方法是将数据类型更改为更合适的选择。

于 2013-05-03T04:42:57.957 回答