我在C#中有一个非常简单的linq to sql查询:
int acctNum = 12345;
var query = from p in db.table
where p.ACCT_NO == acctNum
select p;
这将生成以下SQL:
exec sp_executesql N'SELECT [t0].field1, [t0].field2, [t0].ACCT_NO
FROM [dbo].[table] AS [t0]
WHERE [t0].[ACCT_NO] = @p0', N'@p0 decimal(29,0)', @p0 = 12345
出于某种原因,这需要非常长的时间才能运行(几分钟)。如果我在管理工作室中运行等效查询(从表中选择*,其中acct_no = 12345),则在非常大的表(~7MM行)上花费不到一秒钟。在使用SQL分析器进行一些挖掘之后,我发现linq将acctNum参数作为Decimal(29,0)传递,而该字段作为Numeric(18,0)存储在数据库中。如果我采用生成的SQL并将参数类型从十进制更改为数字,则运行时间不到一秒。在分析器中,我可以看到linq版本使用了近200万次读取,而数字参数查询则使用了大约400次。如何强制linq将此参数作为数字而不是小数传递?
答案 0 :(得分:5)
问题很可能是p.ACCT_NO
的类型(换句话说,它可能是作为浮点数字类型生成的)。确保此属性也被键入为int
,它应该可以正常工作。