2009-09-01 2 views
7

У меня есть очень простой LINQ к SQL-запрос в C#:LINQ к SQL Decimal параметров

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 как десятичный (29,0), а поле хранится в базе данных как числовое (18,0). Если я беру сгенерированный SQL и просто изменяю тип параметра с десятичной на числовую, он работает менее чем за секунду. В профилировщике я вижу, что версия linq использует почти 2 миллиона чтений против 400 для запроса числовых параметров. Как заставить linq передать этот параметр как числовой, а не десятичной?

ответ

5

Скорее всего, проблема связана с типом p.ACCT_NO (другими словами, он, вероятно, был сгенерирован как числовой тип с плавающей запятой). Убедитесь, что это свойство также напечатано как int, и оно должно работать.

+0

Вы имеете в виду тип данных SQL для базового поля базы данных? Его числовое (18,0). – maxpower47

+0

Нет, я имею в виду тип свойства 'ACCT_NO' для любого типа' p'. –

+0

В VS, p.ACCT_NO отображается как десятичный. Как я могу это изменить? – maxpower47