Как узнать, является ли поле числовым в Linq To SQL - PullRequest
9 голосов
/ 17 февраля 2009

Мне нужно выбрать строки таблицы, где значение столбца является числовым, любая справка?

РЕДАКТИРОВАТЬ: у меня есть столбец varchar, и мне нужно выбрать те, которые являются числами, а те, которые не являются.

РЕДАКТИРОВАТЬ 2: Integer.TryParse нельзя использовать, потому что его нельзя перевести на SQL.

Ответы [ 7 ]

14 голосов
/ 04 июня 2009

Откройте файл 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>

Теперь вы можете использовать функцию уже в SQL , называемую «ISNUMERIC». Вот как это сделать:

var blah = myDataContext.Accounts.Where(account=>
    myDataContext.ISNUMERIC(account.ID) == true);

Вот, пожалуйста:)

Вы также можете найти эти функции полезными для копирования:

<Function Name="RAND" IsComposable="true">
  <Return Type="System.Double" DbType="Float NOT NULL" />
</Function>
<Function Name="NEWID" IsComposable="true">
  <Return Type="System.Guid" DbType="UniqueIdentifier NOT NULL" />
</Function>
6 голосов
/ 17 февраля 2009

Я не знаю, есть ли отображение для int.TryParse () в LinqToSQL, но вы, вероятно, могли бы сделать это в два шага, выполнив запрос, приведя к списку, а затем выбрав из списка с помощью LinqToObjects.

int i;
var query = context.Table.ToList();
var intQuery = query.Where( t => int.TryParse( t.Column, out i ) );

Возможно, вы захотите взглянуть и на Dynamic LINQ . Это позволит вам сделать что-то вроде:

var query = context.Table.Where( "IsNumeric(Column)" );

РЕДАКТИРОВАТЬ Динамический LINQ доступен в примерах кода VS2008, ссылки на которые есть в блоге Скотта Гатри, на который я ссылался выше.

5 голосов
/ 16 декабря 2010

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();
    }
1 голос
/ 08 июля 2009
<>.Where(x=>"0123456789".IndexOf(x.value.substring(0,1))>-1)
1 голос
/ 17 февраля 2009

Посмотрите на Int32.TryParse ... Это может работать для вас.

Ian

0 голосов
/ 17 февраля 2009

Вы не сможете сделать это с LINQ2SQL без загрузки всех записей на клиенте.

Я могу предложить создать представление или табличную функцию с дополнительным вычисляемым столбцом, а затем отфильтровать результаты по этому столбцу. Или выполните обычный SQL с DataContext.ExecuteQuery.

0 голосов
/ 17 февраля 2009

(отредактировано в соответствии с вашими потребностями)

Итак, учитывая тот факт, что вы не можете использовать 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

Помогает ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...