在 LINQ to SQL 类中,为什么从实现的外键EntitySet
对象创建的属性IEnumerable
,其中的对象DataContext
是Table
实现的对象IQueryable
?
编辑:为了澄清,这里有一个例子说明了我想要理解的内容。这个例子:
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和s之间的差异IEnumerable
,那么为什么MatchPlayers
第一个示例中的对象没有实现IQueryable
接口以获得与后一个示例相同的好处。