gpt4 book ai didi

linq - LINQ2SQL 中的 EntitySet 与表查询性能

转载 作者:行者123 更新时间:2023-12-04 04:28:02 25 4
gpt4 key购买 nike

在 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 和 IEnumerable s,那么 MatchPlayers 为什么不呢?第一个示例中的对象实现 IQueryable接口(interface)以获得与后一个示例相同的好处。

最佳答案

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

Single() 返回一个匹配,而不是一个 IQueryable(Match)。

只需将 Single() 推到最后一步:
ctx.Matches
.Where(m => m.MatchID == 1)
.Select(m => m.MatchPlayers.Max(mp => mp.Score))
.Single();

此查询显示的是,可以在查询中使用 MatchPlayers 属性。这解决了我对提问者问题的解释 - “为什么我不能在查询中使用 EntitySet?”,你可以。

关于linq - LINQ2SQL 中的 EntitySet 与表查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/200755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com