Как узнать, является ли поле числовым в Linq to SQL
Мне нужно выбрать строки таблицы, где значение столбца числовое, любая помощь?
EDIT: у меня есть столбец varchar, и мне нужно выбрать те, которые являются числами, и те, которые не являются.
Изменить 2: целое число.TryParse нельзя использовать, потому что его нельзя перевести на SQL.
7 ответов
Я не знаю, есть ли отображение для инт.TryParse () в LinqToSQL, но вы, вероятно, могли бы сделать это в два шага, выполнив запрос, приведение к списку, а затем выбрав из списка LinqToObjects.
int i;
var query = context.Table.ToList();
var intQuery = query.Where( t => int.TryParse( t.Column, out i ) );
Вы можете посмотреть на динамические LINQ, которая тоже. Что позволит вам сделать что-то вроде:
var query = context.Table.Where( "IsNumeric(Column)" );
редактировать Dynamic LINQ доступен в образцах кода VS2008, связанных с блогом Скотта Гатри, который у меня есть связанные выше.
откройте файл DBML (LINQ-to-SQL) в Редакторе XML, перейдите в конец файла и вставьте его непосредственно перед узлом " ":
<Function Name="ISNUMERIC" IsComposable="true">
<Parameter Name="Expression" Parameter="Expression" Type="System.String" DbType="NVarChar(4000)" />
<Return Type="System.Boolean" DbType="BIT NOT NULL"/>
</Function>
Теперь, вы можете использовать
SqlFunctions.IsNumeric
http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions.isnumeric.aspx
например:
private int GetLastGoodNumber(string PartNum)
{
return (from row in Db.SerialNo
where
row.PartNum == PartNum
let nullable = System.Data.Objects.SqlClient.SqlFunctions.IsNumeric(row.SerialNumber)
where nullable != null
select nullable.Value).Max();
}
вы не сможете сделать это с LINQ2SQL без загрузки всех записей на клиенте.
Я могу предложить создать представление или табличную функцию с aditional вычисляемым столбцом, а затем отфильтровать результаты с помощью этого столбца. Или выполните обычный SQL с DataContext.Метод executequery.
(отредактировано в соответствии с вашими потребностями)
Итак, учитывая тот факт, что вы не можете использовать Integer.TryParse
, следующее невозможно:
int i;
var rowsWithInts = (From r In dc.YourRows Where Integer.TryParse(r.Column, i));
var rowsWithoutInts = (From r In dc.YourRows Where !Integer.TryParse(r.Column, i));
возможно ли создать хранимую процедуру и связать ее с DataContext через Панель методы? В этом случае вы можете сделать в SQL следующим образом:
-- Rows with integers
SELECT * FROM your_table WHERE ISNUMERIC(varchar_column) = 1
-- Rows without integers
SELECT * FROM your_table WHERE ISNUMERIC(varchar_column) = 0
это помогает?