Ø  简介

在 C# 中与数据交互最常用的语句就是 LINQ 了,而 LINQ to SQL 是最直接与数据库打交道的语句,它可以根据 LINQ 语法生成对应的 SQL 语句,在数据库中去执行。本文主要研究什么样 LINQ 语句会生成什么样 SQL 语句,从而确保编写 LINQ 语句时,便知道该语句会执行什么样的 SQL 语句,得到什么结果,这是很有必要的。因为很多时候会考虑到 SQL 效率问题,和数据是否有误等问题。主要包括:

1.   插入数据

2.   判断记录是否存在

3.   左连接情况下,判断某字段是否为 null 的写法

4.   连接查询关联不同类型(string & int)字段

5.   关联表(一对多关系),一条语句查询主表与子表数据

6.   使用 IQueryable<T> 类型的变量,嵌入 LINQ 查询语法中

7.   常见的查询技巧

8.   使用对象集合进行连接查询

1.   插入数据

1)   LINQ 语句

DataContext.CustomerTodos.Add(entity);

DataContext.SaveChanges();

2)   生成 SQL

exec 、49667的客户与用户记录

var dataList = (from t1 in DataContext.Customers

where t1.Id == 45357 || t1.Id == 49667

select new CustomerModel()

{

Id = (int)t1.Id,

Name = t1.Name,

UserList = (from d1 in DataContext.UserInfoes

where d1.CustomerId == t1.Id

select new CustomerModel.UserInfoModel()

{

Id = d1.id,

UserName = d1.userName

}).ToList()

}).ToList();

2)   生成 SQL

SELECT

3)   执行结果

4)   分析

1.   首先,我们定义了一个 IQueryable<T> 类型的变量,然后在使用这个变量作为数据源,进行关联查询。可见,在生成的 SQL 中直接进行了内连接查询,并输出相关字段。

2.   这种写法主要是可以方便多次查询,可以多次利用这个 allCustomers 条SQL)

exec

3.   分析

1)   每次遍历,都会生成不同的SQL,并查询数据库。

2)   通常情况下,不建议这样去遍历查询,可以先查询出所需的记录,再进行遍历。

3)   根据不同条件生成对应 SQL

1.   LINQ 语句

var query3 = (from t1 in dbContext.Grades

where t1.GradeName.Contains("年级")

orderby t1.GradeId descending

select t1);

for (int i = 1; i <= 3; i++)

{

var entity = query3.Where(o => o.GradeId == i).FirstOrDefault();

Console.WriteLine("获取记录:{0}", (entity != null ? entity.GradeId : 0));}

2.   生成 SQL(类似的3条SQL)

exec sp_executesql N'SELECT TOP (1)

[Project1].[GradeId] AS [GradeId],

[Project1].[GradeName] AS [GradeName],

[Project1].[Remark] AS [Remark]

FROM ( SELECT

[Extent1].[GradeId] AS [GradeId],

[Extent1].[GradeName] AS [GradeName],

[Extent1].[Remark] AS [Remark]

FROM [dbo].[Grade] AS [Extent1]

WHERE ([Extent1].[GradeName] LIKE N''%年级%'') AND ([Extent1].[GradeId] = @p__linq__0) AND (@p__linq__0 IS NOT NULL)

)  AS [Project1]

ORDER BY [Project1].[GradeId] DESC',N'@p__linq__0 int',@p__linq__0=1

3.   分析

1)   每次遍历,都会生成不同的SQL,并查询数据库。

2)   并将条件以 AND(与)进行追加。

3)   通常情况下,不建议这样去遍历查询,可以先查询出所需的记录,再进行遍历。

8.   使用对象集合进行连接查询

1)   LINQ 语句

Class1[] objects = new Class1[]

{

new Class1 { Id = 1, Name = "Name1" },

new Class1 { Id = 2, Name = "Name2" },

new Class1 { Id = 3, Name = "Name3" }

};

var query1 = (from t1 in objects

join t3 in dbContext.Grades on t1.Id equals t3.GradeId

where t1.Name.Contains("2") && t3.GradeName.Contains("二")

select new { t3.GradeId, t1.Name, t3.GradeName });

foreach (var item in query1)

{

Console.WriteLine("获取记录:{0},{1},{2}", item.GradeId, item.Name, item.GradeName);

}

2)   生成 SQL

SELECT

[Extent1].[GradeId] AS [GradeId],

[Extent1].[GradeName] AS [GradeName],

[Extent1].[Remark] AS [Remark]

FROM [dbo].[Grade] AS [Extent1]

3)   执行结果

4)   分析

1.   可见,以对象集合关联查询,生成的查询 SQL 中并没有任何 where 条件。

2.   首先查询所有的“右表数据”,再在程序中进行过滤。

3.   注意:这种关联查询并不是一种标准查询,并且对象集合必须为左表(t1的位置)。否则将抛出异常:System.NotSupportedException,无法创建“EFDBFirst6_0.Class1”类型的常量值。此上下文仅支持基元类型或枚举类型。

4.   最后,不推荐使用该方式连接查询,影响正常思维和效率。

深入理解 LINQ to SQL 生成的 SQL 语句的更多相关文章

  1. 查看Linq to Sql生成的sql语句(转)

    查看Linq to Sql生成的sql语句   在控制台项目中,比较简单,直接db.Log = Console.Out;就OK了 但是在其他项目中,需要处理如下: StreamWriter sw = ...

  2. SqlProfilter监控指定数据库数据表——监控linq组合查询生成的sql

    1.例子 实际测试环境中往往很多测试都在调用数据库,那么如何使用SqlProfilter监控筛选到自己想要监看的数据库对应的表有关linq生成的sql时候就需要做如下设置了 ........... u ...

  3. netcore sqlserver linq contains生成的sql语句不是使用like而是charIndex

    在ef中使用linq调用了contains,结果怎么都查不到值,打开sqlserver profiler 发现生成的sql语句不是使用like...而是CharIndex 参考文档:https://s ...

  4. Linq To EF 用泛型时生成的Sql会查询全表的问题

    1.问题的现象 public class LinqHepler<T> where T:class { private EFDBContext _context = null; /// &l ...

  5. 简单理解ORM,实体类生成查询SQL语句

    目前有很多开源的ORM项目,大多情况下也不需要我们重复去造轮子,我们只需要了解轮子怎么造的,怎么用就可以,下面简单说一下怎么通过实体生成一个SQL语句: 先建立2个Attribute类,TableAt ...

  6. Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成

    前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 ORM 的功能.由于在 09 年最初设计时,ORM 部分的设计并不是最重要 ...

  7. 用LinqPad查看Nhibernate生成的sql语句

    使用Nhibernate开发一般都要对Nhibernate生成的sql语句进行查看及分析,查看Nhibernate生成的sql语句,可以使用NHProfiler和log4net.但NHProfiler ...

  8. 使用工具追踪Entity Framework生成的SQL

    学习entity framework期间收集的文章,转自http://www.cnblogs.com/hiteddy/archive/2011/10/01/Difference_among_IQuer ...

  9. EF查询生成的SQL

    在EF 4和EF 3.5 SP1中,我们可以使用ToTraceString()方法得到EF查询所生成的SQL. using (var context = new TestDBEntities()) { ...

随机推荐

  1. Dynamics 365 CRM 开发架构简介

    Dynamics 365 CRM提供了多种编程模型,你可以灵活地按需选用最佳模式. 本文是对Dynamics 365 CRM编程模型的综述. 概览 下图表明了Dynamics 365 CRM的主要可编 ...

  2. HTML5仿手机微信聊天界面

    HTML5仿手机微信聊天界面 这篇文章主要为大家详细介绍了HTML5仿手机微信聊天界面的关键代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下     给大家带来的是HTML5仿手机微信聊天界面, ...

  3. NetSec2019 20165327 Exp7 网络欺诈防范

    NetSec2019 Exp7 网络欺诈防范 一.本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 (1)简单应用SET工具建立冒名网站 (1分) (2)ette ...

  4. JS深度判断两个对象字段相同

    代码: /** * 判断此对象是否是Object类型 * @param {Object} obj */ function isObject(obj){ return Object.prototype. ...

  5. OpenMP并行程序设计——for循环并行化详解

    在C/C++中使用OpenMP优化代码方便又简单,代码中需要并行处理的往往是一些比较耗时的for循环,所以重点介绍一下OpenMP中for循环的应用.个人感觉只要掌握了文中讲的这些就足够了,如果想要学 ...

  6. ABP大型项目实战(2) - 调试与排错 - 日志 - 查看审计日志

    这是<ABP大型项目实战>系列文章的一篇.   项目发布到生产环境后难免会有错误. 那么如何进行调试和排错呢?   我看到俱乐部里有人是直接登陆生产服务器把数据库下载到开发机器进行调试排错 ...

  7. 深入剖析Redis系列: Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  8. C Programming Style 总结

    对材料C Programming Style for Engineering Computation的总结. 原文如下: C Programming Style for Engineering Com ...

  9. openstack搭建之-horizon配置(14)

    一.ctrl控制节点安装horizon #安装软件yum install openstack-dashboard -y vim /etc/openstack-dashboard/local_setti ...

  10. express和cors跨域

    使用express框架: Express: Express 是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架,为 Web 和移动应用程序提供一组强大的功能. Express 框架核 ...