我遇到了将linq查询转换为sql查询的问题。问题的根源是当我使用IBPUNO字段时,edmx文件中的字符串类型和sql server中的nchar是什么
var query = (from c in ContextM3.MPLINE where c.IBSUNO == supplier.M3Code.Trim() && orderNumbers.Contains(c.IBPUNO)
将linq查询中的“where”子句转换为sql servr,如下所示:
...WHERE ([Extent1].[IBSUNO] = (LTRIM(RTRIM(@p__linq__0)))) AND ([Extent1].[IBPUNO] IN (N''177828'',N''7115912'))',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'8100033 '
如果我在ssms中执行此sql查询,我没有行但是如果我将sql查询更改为
WHERE ([Extent1].[IBSUNO] = (LTRIM(RTRIM(@p__linq__0)))) AND ([Extent1].[IBPUNO] IN (177828,7115912))',N'@p__linq__0 nvarchar(4000)',@p__linq__0=N'8100033 '
然后炒得很好,它检索我想要的行(改变我所做的是翻译 值N''177828''仅为177828所以我的问题我怎么能对网做这个改变?
[Extent1].[IBPUNO] IN (N''177828'',N''7115912'))
要 [Extent1]。[IBPUNO] IN(177828,7115912))
答案 0 :(得分:2)
您可以在orderNumbers
中存储整数而不是字符串,并使用c.IBPUNO
将Convert.ToInt32()
转换为int:
var orderNumbers = new [] { 177828, 7115912 };
var query = (from c in ContextM3.MPLINE
where c.IBSUNO == supplier.M3Code.Trim() &&
orderNumbers.Contains(Convert.ToInt32(c.IBPUNO))
// select etc...
如果可能的话,首先应该让IBPUNO
成为一个int。