2009-09-01 16 views
7

Tengo un LINQ muy sencillo de consulta SQL en C#:LINQ a SQL decimal Parámetro

int acctNum = 12345;      

var query = from p in db.table 
      where p.ACCT_NO == acctNum 
      select p; 

Esto genera el siguiente código 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 

Por alguna razón, esto está tomando un tiempo increíblemente largo tiempo de ejecución (varios minutos). Si ejecuto una consulta equivalente en Management Studio (seleccione * de la tabla donde acct_no = 12345), lleva menos de un segundo en una tabla muy grande (~ 7MM filas). Después de cavar un poco con el generador de perfiles SQL, encontré que linq está pasando el parámetro acctNum como un decimal (29,0) mientras que el campo está almacenado en la base de datos como numérico (18,0). Si tomo el SQL generado y simplemente cambio el tipo de parámetro de decimal a numérico, se ejecuta en menos de un segundo. En el generador de perfiles, puedo ver que la versión de linq usa casi 2 millones de lecturas en comparación con 400 para la consulta de parámetros numéricos. ¿Cómo puedo forzar a linq a pasar este parámetro como numérico en lugar de decimal?

Respuesta

5

Lo más probable es que el problema radique en el tipo de p.ACCT_NO (en otras palabras, probablemente se haya generado como un tipo numérico de coma flotante). Asegúrese de que esta propiedad también esté escrita como int y debería funcionar.

+0

¿Te refieres al tipo de datos SQL del campo de base de datos subyacente? Es un numérico (18,0). – maxpower47

+0

No, me refiero al tipo de la propiedad 'ACCT_NO' en cualquier tipo' p'. –

+0

En VS, p.ACCT_NO se muestra como Decimal. ¿Cómo puedo cambiar eso? – maxpower47