2008-10-14 38 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。