2009-09-01 46 views
7

Tôi có một LINQ rất đơn giản để truy vấn sql trong C#:LINQ to SQL Decimal Parameter

int acctNum = 12345;      

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

này tạo ra các SQL sau:

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 

Đối với một số lý do, điều này được thực thi một cực kỳ dài thời gian để chạy (vài phút). Nếu tôi chạy một truy vấn tương đương trong studio quản lý (chọn * từ bảng nơi acct_no = 12345), phải mất chưa đầy một giây trên một bảng rất lớn (~ 7MM hàng). Sau khi một số đào với lược tả SQL, tôi thấy rằng LINQ đang chuyển tham số acctNum dưới dạng thập phân (29,0) trong khi trường được lưu trữ trong cơ sở dữ liệu dưới dạng số (18,0). Nếu tôi lấy SQL được sinh ra và chỉ thay đổi kiểu tham số từ thập phân sang số, nó chạy trong chưa đến một giây. Trong profiler, tôi có thể thấy rằng phiên bản LINQ sử dụng gần 2 triệu lượt đọc so với khoảng 400 cho truy vấn tham số. Làm thế nào tôi có thể buộc LINQ chuyển tham số này dưới dạng số thay vì số thập phân?

Trả lời

5

Rất có thể vấn đề nằm ở loại p.ACCT_NO (nói cách khác nó có thể được tạo dưới dạng kiểu số dấu phẩy động). Đảm bảo rằng thuộc tính này cũng được nhập là int và nó sẽ hoạt động.

+0

Bạn có phải là loại dữ liệu SQL của trường cơ sở dữ liệu cơ bản không? Một số của nó (18,0). – maxpower47

+0

Không, ý tôi là loại thuộc tính 'ACCT_NO' trên bất kỳ loại' p' nào. –

+0

Trong VS, p.ACCT_NO hiển thị dưới dạng Thập phân. Làm thế nào tôi có thể thay đổi điều đó? – maxpower47