Я переношу устаревшее приложение 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.
Возможный дубликат http://stackoverflow.com/questions/16694716/entity-framework-linq-expression-converting-from-string-to-int –
Я опубликовал это, потому что путаница с linq и фактическим запросом DB2 .. Может ли DB2 сохранять номера в виде строк и выполнять на ней числовые операции? если да, то как заставить его работать в LINQ? – Gowrish
Измените свой вопрос, чтобы включить DB2 DDL для таблицы, или, по крайней мере, вывод 'DESCRIBE TABLE db23.employees' и' DESCRIBE TABLE db23.contact' –