2013-05-03 2 views
0

Я пытаюсь получить наибольшее число из поля в моей базе данных, используя этот код:Как получить наибольшее количество?

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

Когда я выполнить запрос я получаю результат «999», который является неправильным, потому что самым большим числом в Databse является 1601. Имеет ли тип данных Nvarchar в области базы данных?

Как я могу исправить свой код, чтобы получить правильное максимальное число.

+0

Вы используете рамки Entity, потому что вы, возможно, придется использовать [SqlFunctions.StringConvert] (http://msdn.microsoft.com/en-us/library/dd487158.aspx) методы – Habib

+0

Linq к SQL или Linq к сущностям или ...? –

+0

Я использую Linq To Sql. Спасибо – JayJay

ответ

3

Поскольку вы используете LINQ к 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 cast, потому что не является концепцией переинтерпретации тех же бит, что и у другого типа . Вот почему C# cast работает только локально. Это не удалено.

+2

+1 Не думайте, что 'int.Parse()' работает либо в Linq to Entities, либо Linq to SQL, поэтому это, вероятно, должно быть решением. –

+0

@Joachim Isaksson Да, ты прав и большое спасибо за поддержку! – JayJay

12

"999" > "1601" как сравнение строк - поэтому для получения результата вы хотите преобразовать значения строк в числа.

Самый простой подход - использовать .Select(s => int.Parse(s)).Max()) (или .Max(s => int.Parse(s))) вместо .Max(), который заканчивается использованием регулярного сравнения строк.

Обратите внимание, что в зависимости от того, откуда поступают данные, могут быть гораздо лучшие способы получения целочисленных результатов (включая изменение типа поля в базе данных). Используя .Select по запросу, скорее всего, принудительный запрос возвращает все строки из БД и только вычисляет Макс. В памяти.

0

Попробуйте

var bb=(from c in Office_TBLs select (e => e.CodeNumber).Max()) 
0

Если вы используете NVarChar, то вы просите, чтобы иметь значения, отсортированные в алфавитном порядке. «999» приходит после «1601», как «ZZZ» появляется после «HUGS».

Если столбец должен содержать только числовые значения, лучшим решением является изменение типа данных на более подходящий выбор.