为什么LINQ连接比链接到哪里要快得多?我最近升级到VS 2010,并正在玩LINQtoDataSet。我有一个强类型的授权数据集,它位于ASP.NETWebApplication的HttpCache中。所以我想知道什么是检查用户是否被授权做某事的最快方法。这里如果有人感兴趣的话我的数据模型和其他信息。我检查了三种方法:直接数据库Linq查询哪里作为“联接”的条件-句法Linq查询加入-句法以下是对每个函数进行1000次调用的结果:1.国际:4,2841519秒115,7796925秒2,024749秒2.国际:3,1954857秒84,97047秒1,5783397秒3.国际:2,7922143秒97,8713267秒1,8432163秒平均:数据库:3,4239506333秒地点:99,5404964秒加入:1,815435秒。为什么连接版本比WHERE语法快得多,这使得它变得无用,尽管作为LINQ新手,它似乎是最易读的。还是我在问询中遗漏了什么?下面是LINQ查询,我跳过了数据库:哪里:Public Function hasAccessDS_Where(ByVal accessRule As String) As Boolean
Dim userID As Guid = DirectCast(Membership.GetUser.ProviderUserKey, Guid)
Dim query = From accRule In Authorization.dsAuth.aspnet_AccessRule, _
roleAccRule In Authorization.dsAuth.aspnet_RoleAccessRule, _
role In Authorization.dsAuth.aspnet_Roles, _
userRole In Authorization.dsAuth.aspnet_UsersInRoles _
Where accRule.idAccessRule = roleAccRule.fiAccessRule _
And roleAccRule.fiRole = role.RoleId _
And userRole.RoleId = role.RoleId _
And userRole.UserId = userID And accRule.RuleName.Contains(accessRule)
Select accRule.idAccessRule Return query.AnyEnd Function加入:Public Function hasAccessDS_Join(ByVal accessRule As String) As Boolean
Dim userID As Guid = DirectCast(Membership.GetUser.ProviderUserKey, Guid)
Dim query = From accRule In Authorization.dsAuth.aspnet_AccessRule _
Join roleAccRule In Authorization.dsAuth.aspnet_RoleAccessRule _
On accRule.idAccessRule Equals roleAccRule.fiAccessRule _
Join role In Authorization.dsAuth.aspnet_Roles _
On role.RoleId Equals roleAccRule.fiRole _
Join userRole In Authorization.dsAuth.aspnet_UsersInRoles _
On userRole.RoleId Equals role.RoleId _提前谢谢
3 回答

临摹微笑
TA贡献1982条经验 获得超2个赞
您的第一种方法(DB中的SQL查询)非常有效,因为DB知道如何执行联接。但是,将其与其他方法进行比较是没有意义的,因为它们直接在内存中工作(Linq To DataSet) 具有多个表和 Where
条件实际上执行 笛卡尔积在所有的桌子中, 然后过滤满足条件的行。这意味着 Where
为每个行组合(N1*n2*n3*n4)评估条件。 这个 Join
运算符从第一个表中获取行,然后只从第二个表中获取具有匹配键的行,然后只从第三个表获取具有匹配键的行,依此类推。这要高效得多,因为它不需要执行那么多的操作

叮当猫咪
TA贡献1776条经验 获得超12个赞
Join
Where
Join
Where

开心每一天1111
TA贡献1836条经验 获得超13个赞
- 3 回答
- 0 关注
- 247 浏览
添加回答
举报
0/150
提交
取消