2015-02-16 4 views
0

Я переношу устаревшее приложение DB2 в веб-приложение, и я использую ASP.NET WebAPI с инфраструктурой сущности.Преобразование строки в число DB2 Entity Framework

Это первый раз, когда я работаю с DB2.

Я установил необходимые драйверы и установил пакеты для базы данных DB2. Я создал EDMX для существующих таблиц базы данных DB2.

Все работает нормально. У меня возникла странная проблема: в одном из запросов DB2 SQL столбец строк сравнивается с числом.

Рассмотрим следующий запрос,

SELECT DISTINCT DB23.EMPLOYEES.FIRST_NAME, 
    DB23.EMPLOYEES.LAST_NAME, 
    STRIP("DB23"."EMPLOYEES"."STATE_NAME") STATE_NAME, 
    DB23.CONTACT.PHONE_NO 
FROM DB23.EMPLOYEES, 
    DB23.CONTACT 
WHERE (DB23.EMPLOYEES.EMP_ID = DB23.CONTACT.EMP_ID) and  
    (DB23.CONTACT.EMP_REG_NO < '900000') 
ORDER BY DB23.EMPLOYEES.FIRST_NAME ASC 

здесь столбец EMP_REG_NO является строка типа и сравнивается с числом, используя меньше «<» оператора и странное дело в том, что тот же запрос отлично работает в IBM DB2 Server Client.

Ниже одно выражение Linq, что я написал

from emp in _DB2Context.EMPLOYEES 
join cont in _DB2Context.CONTACT on emp.EMP_ID equals cont.EMP_ID 
where cont.EMP_REG_ID < 900000 
select new { 
    emp.FIRST_NAME 
    emp.LAST_NAME 
    emp.STATE_NAME 
    cont.PHONE_NO 
}; 

Здесь мы не можем сравнивать число 900000 с колонкой типа строки.

Я попытался, как этот

from emp in _DB2Context.EMPLOYEES 
join cont in _DB2Context.CONTACT on emp.EMP_ID equals cont.EMP_ID 
where Convert.ToInt64(cont.EMP_REG_ID) < 900000 
select new { 
    emp.FIRST_NAME 
    emp.LAST_NAME 
    emp.STATE_NAME 
    cont.PHONE_NO 
}; 

Это дало мне ошибку, что LINQ не распознает метод Convert.ToInt64(), и я понял, что Там нет эквивалентного метода для достижения преобразования в T-SQL заявление.

Любые идеи?

Обновление:

Внизу структура таблицы

TABLE - EMPLOYEES 
*************************************************************************** 

Name   Data Type  Type schema Length Scale Nulls Hidden 
--------------- ------------- ------------- -------- ------- ----- -------- 
EMP_ID   CHARACTER  SYSIBM    2  0 N  Not 
FIRST_NAME  CHARACTER  SYSIBM    30  0 N  Not  
LAST_NAME  CHARACTER  SYSIBM    30  0 N  Not  
STATE_NAME  CHARACTER  SYSIBM    25  0 N  Not  
FIPS_CTRY_CD CHARACTER  SYSIBM    2  0 N  Not  
POLK_STATE_CD CHARACTER  SYSIBM    2  0 N  Not  
MAIL_STATE  CHARACTER  SYSIBM    15  0 N  Not  

**************************************************************************** 

TABLE - CONTACT 
**************************************************************************** 

Name   Data Type  Type schema Length Scale Nulls Hidden 
--------------- ------------- ------------- -------- ------- ----- -------- 
EMP_ID   CHARACTER  SYSIBM    2  0 N  Not 
REG_NO   CHARACTER  SYSIBM    6  0 N  Not  
REG_STATE_CD CHARACTER  SYSIBM    2  0 Y  Not  
PHONE_NO  CHARACTER  SYSIBM    15  0 N  Not  
REG_STATE  CHARACTER  SYSIBM    2  0 N  Not  
CORP_NAME  CHARACTER  SYSIBM    30  0 N  Not  

*************************************************************************** 

Внизу классы POCO, порожденные рамках сущности

public partial class EMPLOYEES 
{ 
    public string EMP_ID { get; set; } 
    public string FIRST_NAME { get; set; } 
    public string LAST_NAME { get; set; } 
    public string STATE_NAME { get; set; } 
    public string FIPS_CTRY_CD { get; set; } 
    public string POLK_STATE_CD { get; set; } 
    public string MAIL_STATE { get; set; } 
} 

public partial class CONTACT 
{ 
    public string EMP_ID { get; set; } 
    public string REG_NO { get; set; } 
    public string REG_STATE_CD { get; set; } 
    public string PHONE_NO { get; set; } 
    public string REG_STATE { get; set; } 
    public string CORP_NAME { get; set; } 
} 

кроме того, я могу иметь возможность запускать ниже простой запрос в процессоре командной строки DB2

SELECT 
DB23.CONTACT.EMP_ID 
FROM DB23.CONTACT 
WHERE DB23.CONTACT.EMP_ID < '900000' 

SELECT 
DB23.CONTACT.EMP_ID 
FROM DB23.CONTACT 
WHERE DB23.CONTACT.EMP_ID < 900000 

Оба DB2 запрос возвращает результат

EMP_ID 
------ 
123 
234 

Но я не могу сделать то же самое с помощью LINQ, как,

from cont in _DB2Context.CONTACT 
where cont.DLR_NO < 90000 // here getting an error says that Operator '<' cannot be applied to operands of type 'string' and 'int' 
select new { 
    cont.DLR_NO 
} 

from cont in _DB2Context.CONTACT 
where cont.DLR_NO < '90000' // here getting an error says that Operator '<' cannot be applied to operands of type 'string' and 'char' 
select new { 
    cont.DLR_NO 
} 

Спасибо, Gowrish.

+0

Возможный дубликат http://stackoverflow.com/questions/16694716/entity-framework-linq-expression-converting-from-string-to-int –

+0

Я опубликовал это, потому что путаница с linq и фактическим запросом DB2 .. Может ли DB2 сохранять номера в виде строк и выполнять на ней числовые операции? если да, то как заставить его работать в LINQ? – Gowrish

+0

Измените свой вопрос, чтобы включить DB2 DDL для таблицы, или, по крайней мере, вывод 'DESCRIBE TABLE db23.employees' и' DESCRIBE TABLE db23.contact' –

ответ

1

Если предположить, что он будет переведен в его SQL эквивалент, попробуйте использовать что-то вроде

where cont.DLR_NO.CompareTo("90000") < 0

Что касается строки в целое число преобразования, то нет никакой гарантии, что CHARACTER столбец в базе данных будет всегда содержать только цифр, что делает любую программу, которая настаивает на том, чтобы поставить этот столбец на целое число рискованной ставкой. В таких ситуациях безопаснее преобразовать ваш числовой литерал в строку сначала (от 90000 до "90000"), поэтому вы просто сравниваете две строки.

+0

Блестящая идея! Большое спасибо :) – Gowrish

Смежные вопросы