2008-10-14 40 views
9

表的查詢性能在LINQ to SQL類,爲什麼屬性是從外鍵創建EntitySet對象,實施IEnumerable,其中作爲對DataContext的對象是其實現IQueryableTable對象?的EntitySet VS在LINQ2SQL

編輯:爲了澄清,這裏是一個例子,說明我試圖理解。這個例子:

ctx.Matches.Where(x => x.MatchID == 1).Single() 
      .MatchPlayers.Max(x => x.Score); 

訪問數據庫的兩倍,其中如:

ctx.MatchPlayers.Where(x => x.MatchID == 1) 
       .Max(x => x.Score); 

只能運行1個查詢。這裏有痕跡:

exec sp_executesql N'SELECT [t0].[MatchID], [t0].[Date] 
FROM [dbo].[Matches] AS [t0] 
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1 
go 
exec sp_executesql N'SELECT [t0].[MatchID], [t0].[PlayerID], [t0].[Score] 
FROM [dbo].[MatchPlayers] AS [t0] 
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1 
go 

exec sp_executesql N'SELECT MAX([t0].[Score]) AS [value] 
FROM [dbo].[MatchPlayers] AS [t0] 
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1 
go 

這也表明,更糟的是,最大是在C#的水平,而不是在數據庫中完成的。

我知道,發生這種情況的原因是IQueryable S和IEnumerable S之間的差別,所以爲什麼不MatchPlayers對象在第一個示例實現IQueryable接口來獲得同樣的好處,因爲後者的例子。

回答

1

表是有效的概念事 - 他們真的存在於服務器上,所以你需要查詢來獲取項目。外鍵條目實際上是由另一個查詢獲取的條目,因此此時它們在本地可用。這是一個相當毛茸茸的描述,但希望它能克服一般概念。

3
ctx.Matches.Where(x => x.MatchID == 1).Single() 

Single()返回Match,而不是IQueryable(Match)。

只需按下單()關閉的最後一步:

ctx.Matches 
    .Where(m => m.MatchID == 1) 
    .Select(m => m.MatchPlayers.Max(mp => mp.Score)) 
    .Single(); 

什麼這個查詢顯示的是,它的確定使用MatchPlayers財產查詢。這解決了我對提問者問題的解釋 - 「爲什麼我不能在查詢中使用EntitySet?」,您可以。

0

這是addressed on the MSDN forums。推理的要點是,在對數據庫進行查詢時跟蹤添加和刪除的對象非常困難。相反,EntitySet是您可以操作的相關對象的本地副本。不幸的是,你是否注意到,這已經下放表達成LINQ到對象的副作用調用,而不是表現較好的LINQ to SQL。