Как узнать, является ли поле числовым в 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();
    }

посмотрите в Int32.Метод tryparse ... Это может сработать.

Иэн


<>.Where(x=>"0123456789".IndexOf(x.value.substring(0,1))>-1)

вы не сможете сделать это с 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

это помогает?