2012-04-14 83 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