将字符串转换为数字 DB2 Entity Framework
Converting a string to number DB2 Entity Framework
我正在将遗留 DB2 应用程序迁移到 Web 应用程序,并且我正在使用 ASP.NET WebAPI 和 entity framework。
这是我第一次使用 DB2。
我已经为 DB2 安装了必要的驱动程序和修复包 database.I 已经为现有的 DB2 数据库 table 生成了 EDMX。
一切正常。我遇到了一个奇怪的问题,在 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 是 string 类型,它与使用小于 '<' 运算符,奇怪的是相同的查询 运行s 在 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结构
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
***************************************************************************
下面是entity framework
生成的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 查询 returns 结果
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
}
谢谢,
高利什。
假设它将被翻译成它的 SQL 等价物,尝试使用类似
的东西
where cont.DLR_NO.CompareTo("90000") < 0
至于字符串到整数的转换,您不能保证数据库中的 CHARACTER
列永远只包含数字,这使得任何坚持将该列转换为整数的程序都是有风险的。在这些情况下,首先将数字文字转换为字符串(从 90000
到 "90000"
)会更安全,因此您只需比较两个字符串。
我正在将遗留 DB2 应用程序迁移到 Web 应用程序,并且我正在使用 ASP.NET WebAPI 和 entity framework。
这是我第一次使用 DB2。
我已经为 DB2 安装了必要的驱动程序和修复包 database.I 已经为现有的 DB2 数据库 table 生成了 EDMX。
一切正常。我遇到了一个奇怪的问题,在 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 是 string 类型,它与使用小于 '<' 运算符,奇怪的是相同的查询 运行s 在 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结构
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
***************************************************************************
下面是entity framework
生成的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 查询 returns 结果
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
}
谢谢, 高利什。
假设它将被翻译成它的 SQL 等价物,尝试使用类似
的东西where cont.DLR_NO.CompareTo("90000") < 0
至于字符串到整数的转换,您不能保证数据库中的 CHARACTER
列永远只包含数字,这使得任何坚持将该列转换为整数的程序都是有风险的。在这些情况下,首先将数字文字转换为字符串(从 90000
到 "90000"
)会更安全,因此您只需比较两个字符串。