美文网首页.NETAmazing .NET
剖析LinqToEntity查询语句

剖析LinqToEntity查询语句

作者: 94801e743f16 | 来源:发表于2019-02-16 22:09 被阅读23次

本文将对LinqToEntity的方法进行分析,得出在实际开发过程中,什么时候应该使用什么方法。

实验工具

  • Visual Studio2015/2017
  • SqlServer2014
  • SQL Server Profiler

实验步骤

  1. 根据不同情况编写Linq查询语句
  2. 运行Linq查询程序
  3. 使用SQL Server Profiler跟踪查询情况
  4. 分析查询结果数据

实验开始

1.GetAll()方法

示例用法

GetAll方法
产生SQL语句如下
image

错误示例

image.png
 产生SQL如下
image.png

结论

  • GetAll方法的只能在获取该表所有数据的场景下使用
  • GetAll方法后面接的Where方法将不会生成SQL,也就是说Where是在把数据加载到内存中再进行筛选。

2.GetList()方法

示例用法

image.png
产生SQL如下
GetList

错误示例

image.png
产生SQL如下
image.png

结论

  • GetList()方法是在获取指定条件数据的场景下使用
  • 错误示例指出在GetList后的分页方法在SQL上无体现,同上,也是加载到内存之后再进行分页操作

3.Get()方法

示例用法

image.png
产生SQL如下
image.png

结论

  • Get()方法是在获取某条件的唯一数据场景下使用

4.GetById()方法

示例用法

image.png
产生SQL如下
image.png

结论

  • 在SQL中看出生成的SQL语句使用了参数化查询
  • GetById方法的使用场景是使用该表的主键来获取数据
  • 有一个疑问点就是为什么是Top(2),虽然主键是没关系

5.Add()方法

示例用法

image.png
产生SQL如下
image.png

结论

  • 可以看出Insert使用了参数化查询
  • Insert之后还查询了一下主键返回给实体

6.BatchAdd()方法

示例用法

image.png
产生SQL如下
image.png

结论

  • 呃呃呃,可以看出是执行了两次SQL
  • 所以说EF的性能问题,归根结底都是批量操作出的问题
  • 该方法用户批量添加数据,但批量执行时间倒没优化多少,SQL方面没有减少,内存处理倒少了一点点

7.Update()方法

示例用法

image.png
产生SQL如下
image.png

结论

  • Update方法需要查询出实体然后才能进行更新

8.Delete()方法

示例用法

image.png
产生SQL如下
image.png

结论

  • Delete方法需要查询出实体然后才能进行删除

9.Exist()方法

示例用法

image.png
产生SQL如下
image.png

结论

  • SQL语句大概意思是:存在数据返回1 不存在返回0
  • 效率呢,也总比查出数据判断好
  • Exist方法在判断数据是否存在的时候使用

10.Any()方法

示例用法

Any方法
产生SQL如下
image.png

结论

  • 跟Exist()一样哦,还不错

11.Except()方法

示例用法

image.png
产生SQL如下
image.png

结论

  • Except方法是用来求两个数组的差集
  • 在生成SQL的方面来看也没有多余操作,性能还OK

12.Union()方法

示例用法

image.png
产生SQL如下
image.png

结论

  • Union作用是连接不同集合,自动过滤相同项
  • SQL语句也是完美的翻译了

13.Concat()方法

示例用法

image.png
产生SQL如下
image.png

结论

  • Concat与Union相似,不同的是Concat没有过滤重复项

14.Intersect()方法

示例用法

image.png
产生SQL如下
image.png

结论

  • Intersect作用是获取两个集合的交集
  • SQL语句还行

15.DistinctBy()方法

示例用法

image.png
产生SQL如下
image.png

结论

  • 从表面上来看,方法的作用是跟住某一字段来进行去重操作
  • 从生成的SQL上来看,这是个巨大的坑
  • 方法的原理是把所有数据加载到内存中进行筛选去重

16.Distinct()方法

示例用法

image.png
产生SQL如下
image.png

结论

  • 从SQL上看,跟DistinctBy一个卵样,也是个性能坑
  • 在实际开发过程中尽量不要使用这两个方法

17.Join

示例用法

image.png
产生SQL如下
image.png

结论

  • Join是SQL中的内连接,用于连表查询操作

18.GroupJoin

示例用法

image.png
产生SQL如下
image.png

结论

  • 从SQL看出GroupJoin产生的SQL语句是子查询操作
  • 而且进一步分析GroupJoin里Y的操作越多,子查询的嵌套层数就越多。从而造成SQL性能极低。
  • 开发中可代替左查询操作,但是性能确实会比左查询低
  • 如需要左查询可以使用LinqToSQL中的DefaultIfEmpty实现

19.扩展方法-BatchUpdate()

示例用法

image.png
产生SQL如下
image.png

结论

  • 从SQL中看出这是一个直接更新子查询结果的SQL从而使批量更新性能提上去
  • 方法需要引入EntityFramework.Extensions扩展类

20.扩展方法-BatchDelete()

示例用法

image.png
产生SQL如下
image.png

结论

  • SQL中看出BatchDelete方法是删除子查询结果来实现批量删除操作。
  • 方法需要引入EntityFramework.Extensions扩展类

相关文章

  • 剖析LinqToEntity查询语句

    本文将对LinqToEntity的方法进行分析,得出在实际开发过程中,什么时候应该使用什么方法。 实验工具 Vis...

  • 《高性能mysql》笔记-剖析数据库语句

    剖析数据库语句 1.慢查询日志 MySQL慢查询日志是一种轻量而且功能全面的性能剖析工具、CPU开销小; http...

  • 复习数据库MySQL语句(一)

    创建表语句 插入语句 多值插入语句 查询语句 查询条件语句 查询包含语句 范围查询语句 过滤查询 更新语句/修改语...

  • mysql第五天-子查询、分页查询、联合查询

    子查询 子查询介绍 含义:出现在其他语句(增删改查语句)中的select语句,称为子查询或内查询,外部的查询语句,...

  • 5. DQL语句和查询相关语句以及多表查询

    DQL语句和查询相关语句以及多表查询 一. DQL语句 数据查询语句DQL(Data Query Language...

  • MYSQL-子查询

    子查询是一个查询语句嵌套在另一个查询语句中。内层查询语句的结果,可以为外层查询语句提供查询条件。 子查询关键字:i...

  • SQL第3/n篇(持续更新中)子查询很重要

    进阶7 子查询 含义:子查询(内查询):出现在其他语句中的select语句主查询(外查询):外部的查询语句分类...

  • Java自学-JDBC 查询

    在JDBC中使用ResultSet查询SQL语句 执行查询SQL语句 步骤 1 : 查询语句 executeQue...

  • 2018-09-02

    Linux DNS 查询剖析(第一部分)Linux DNS 查询剖析(第二部分)Linux DNS 查询剖析(第三...

  • 子查询

    出现在select语句中的select语句,称为子查询或内查询 外部的select查询语句,称为主查询或外查询 子...

网友评论

    本文标题:剖析LinqToEntity查询语句

    本文链接:https://www.haomeiwen.com/subject/grxweqtx.html