2012-04-25 59 views
1

當我執行LINQ2SQL查詢像使用Single()時,Linq2Sql生成的sql是否包含Top?

db.Items.Single(it => it.Id == 1) 

一些人堅持生成的SQL就像

select TOP (2) [t0].Id, [t0].Name 
from [dbo].[SomeTable] as [t0] 
where [t0].Id = @p0 

但我從SQL Server事件探查器(和Linqpad的SQL窗口,VS的IntelliTrace窗口)獲得表明sql不包含任何TOP,只是普通的

select [t0].Id, [t0].Name 
from [dbo].[SomeTable] as [t0] 
where [t0].Id = @p0 

Linq版本是否重要?我使用.Net框架4.0,並引用4.0版本的System.Data.Linq dll。

+0

'Id'字段保證是唯一的嗎?如果是這樣,TOP不需要確保只返回1條記錄。你可以嘗試一個不依賴唯一性的查詢嗎? – PinnyM 2012-04-25 03:55:32

+0

你是如何得到使用TOP的查詢的?您可以在引用TOP的地方引用它。 – Marshal 2012-04-25 04:08:29

+0

@PinnyM使用其他非唯一字段產生相同的SQL,沒有TOP – 2012-04-25 06:13:17

回答

2

第一個查詢由Entity Framework生成,它使用TOP(2),但第二個查詢由Linq-to-Sql生成,它不使用TOP(2),而是在讀取邏輯中檢查結果集是否包含多於一條記錄(並在此情況下放棄閱讀)。

+0

是的,Entity Framework生成TOP(2),而Linq-to-Sql不生成TOP。 – 2012-04-25 08:09:53

相關問題