2012-04-14 34 views
15

Hi Tôi có chút mã này LINQLINQ Chọn Đầu tiên

var fp = lnq.attaches.First(a => a.sysid == sysid).name; 

Khi cấu hình nó tạo ra t-sql sau

SELECT TOP (1) [t0].[sysid], [t0].[name], [t0].[att_size], [t0].[cid], [t0].[flags], [t0].[contents] 
FROM [lntmuser].[attach] AS [t0] 

Con đường tôi nhìn vào nó, nó đang trở lại như một lựa chọn *, điều này sẽ khiến truy vấn thực hiện quét bảng thay vì sử dụng chỉ mục. Xấu cho hiệu suất.

Làm thế nào tôi có thể chọn chỉ cột tên, như:

SELECT TOP (1)[t0].[name] FROM [lntmuser].[attach] AS [t0] 

Cảm ơn trước


Edit: hỏng Kính hồ sơ giải pháp như mong muốn

SELECT TOP (1) [t0].[name] 
FROM [lntmuser].[attach] AS [t0] 
WHERE [t0].[sysid] = @p0 

Trả lời

25

Dự án tài sản name trước khi sử dụng First() :

var fp = lnq.attaches.Where(a => a.sysid == sysid) 
        .Select(a => a.name) 
        .First(); 

này không thay đổi việc sử dụng một chỉ số mặc dù - cho rằng khoản Where của bạn là trách nhiệm (trong truy vấn ban đầu của bạn lambda bạn truyền cho First()). Cả hai truy vấn đều được hưởng lợi từ một chỉ mục trên cột name, cột thứ hai chỉ nhanh hơn vì chỉ có một giá trị cột được thực hiện.

+1

Hãy tò mò muốn xem mã này trông như thế nào trong Profiler. – dtown123

+0

@ dtown123 Vâng đó là điều đầu tiên tôi làm lol, tôi đã thêm mã vào câu trả lời. –

+0

@BrokenGlass Sẽ đánh dấu câu trả lời ngay khi nó cho phép tôi cảm ơn sự giúp đỡ của bạn –

Các vấn đề liên quan