2009-09-01 13 views
7

Mam bardzo proste LINQ do kwerendy SQL w C#:LINQ to SQL dziesiętne Parametr

int acctNum = 12345;      

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

ta generuje następujące 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 

z jakiegoś powodu, to trwa niezwykle długo czas do uruchomienia (kilka minut). Jeśli uruchomię równoważne zapytanie w zarządzaniu studio (wybierz * z tabeli, gdzie acct_no = 12345), zajmuje mniej niż sekundę na bardzo dużej tabeli (~ 7 mm wierszy). Po kilku wykopaliskach za pomocą profilera SQL odkryłem, że linq przechodzi przez parametr acctNum jako dziesiętny (29,0), podczas gdy pole jest przechowywane w bazie danych jako numeryczne (18,0). Jeśli wziąłem wygenerowany SQL i po prostu zmieniłem typ parametru z dziesiętnego na liczbowy, to działa w mniej niż sekundę. W profilerze widzę, że wersja linq używa prawie 2 milionów odczytów w porównaniu do około 400 dla kwerendy parametrów numerycznych. Jak zmusić Linq, aby przekazał ten parametr jako numeryczny zamiast dziesiętnego?

Odpowiedz

5

Najprawdopodobniej problem leży w typie p.ACCT_NO (innymi słowy, został prawdopodobnie wygenerowany jako liczba liczb zmiennoprzecinkowych). Upewnij się, że ta właściwość jest również wpisana jako int i powinna działać.

+0

Masz na myśli typ danych SQL w bazowym polu bazy danych? Jest to numeryczne (18,0). – maxpower47

+0

Nie, mam na myśli typ właściwości 'ACCT_NO' na dowolnym typie' p'. –

+0

W VS, p.ACCT_NO pokazuje się jako dziesiętny. Jak mogę to zmienić? – maxpower47