为了账号安全,请及时绑定邮箱和手机立即绑定

为什么LINQ连接比链接到哪里要快得多?

为什么LINQ连接比链接到哪里要快得多?

绝地无双 2019-06-18 11:22:15
为什么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个赞

  1. 您的第一种方法(DB中的SQL查询)非常有效,因为DB知道如何执行联接。但是,将其与其他方法进行比较是没有意义的,因为它们直接在内存中工作(Linq To DataSet)

  2. 具有多个表和Where条件实际上执行笛卡尔积在所有的桌子中,然后过滤满足条件的行。这意味着Where为每个行组合(N1*n2*n3*n4)评估条件。

  3. 这个Join运算符从第一个表中获取行,然后只从第二个表中获取具有匹配键的行,然后只从第三个表获取具有匹配键的行,依此类推。这要高效得多,因为它不需要执行那么多的操作


查看完整回答
反对 回复 2019-06-18
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

这个Join因为该方法知道如何组合表以将结果降为相关的组合,因此速度要快得多。当你使用Where要指定关系,必须创建每个可能的组合,然后测试条件以确定哪些组合是相关的。

这个Join方法可以设置哈希表,将其用作快速将两个表压缩到一起的索引,而Where方法在已经创建了所有组合之后运行,因此它不能使用任何技巧来预先减少组合。


查看完整回答
反对 回复 2019-06-18
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

您真正需要知道的是为这两个语句创建的SQL。有几种方法可以实现它,但最简单的方法是使用LinqPad。查询结果上方有几个按钮将更改为SQL。这会给你更多的信息。

不过,你在那里分享了很棒的信息。


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 247 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号