2012-04-14 79 views
15

您好我有LINQ代碼LINQ選擇第

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

此位當異形它會生成以下的T-SQL

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

我看它的樣子,它返回像一個選擇*,這將導致查詢執行表掃描而不是使用索引。性能不佳。

我怎麼會選擇只是名字列,例如:根據需要

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

回答

25

項目到 碎玻璃解決方案簡介:提前

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

感謝


編輯使用前的name財產First()

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

這並不改變使用索引雖然 - 爲您Where條款負責(在你的初始查詢您傳遞給First()拉姆達)。這兩個查詢都受益於name列的索引,第二個查詢的速度更快,因爲只有一列值必須實現。

+1

想知道這個代碼在Profiler中的樣子是什麼。 – dtown123 2012-04-14 00:40:19

+0

@ dtown123是的,這是我做的第一件事,我在答案中加入了代碼。 – 2012-04-14 00:46:02

+0

@BrokenGlass只要它讓我感謝你的幫助,它會立即回答 – 2012-04-14 00:47:16