深入理解 LINQ to SQL 生成的 SQL 语句

Ø  简介

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

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

 

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

说明:UserInfo.CustomerId 关联 Customer.Id,为多对一的关系。但是 UserInfo.CustomerId 字段可能为 null

1)   LINQ 语句

var datas1 = (from t1 in DataContext.UserInfoes

                join t2 in DataContext.Customers on t1.CustomerId equals t2.Id into t12

                from t3 in t12.DefaultIfEmpty()

                where t1.id > 5000

                select new

                {

                    UserId = t1.id,

                    CustomerId1 = t1.CustomerId,

                    CustomerId2 = t3 == null ? 0 : t3.Id

                }).Take(3).ToArray();

2)   生成 SQL

SELECT

    [Limit1].[C1] AS [C1],

    [Limit1].[id] AS [id],

    [Limit1].[CustomerId] AS [CustomerId],

    [Limit1].[C2] AS [C2]

    FROM ( SELECT TOP (3)

        [Extent1].[id] AS [id],

        [Extent1].[CustomerId] AS [CustomerId],

        1 AS [C1],

        CASE WHEN ([Extent2].[Id] IS NULL) THEN cast(0 as bigint) ELSE [Extent2].[Id] END AS [C2]

        FROM  [dbo].[UserInfo] AS [Extent1]

        LEFT OUTER JOIN [dbo].[Customer] AS [Extent2] ON [Extent1].[CustomerId] = [Extent2].[Id]

        WHERE [Extent1].[id] > 5000

    )  AS [Limit1]

3)   执行结果

clip_image001[4]

4)   分析

1.   这种写法其实看起来很怪异,为什么要用一个实体去判断是否被关联呢(这是同事善用的而一种写法,哈哈)?

2.   可见,在生成的 SQL 中使用了 CASE 做了一下判断,使用右表的主键 Id,如果为 null,就输出默认值,否则正常输出。

3.   其实,我们还可以使用可空类型接受右表的字段,可以省去 CASE 子句的判断。

猜你喜欢

转载自www.cnblogs.com/abeam/p/9377167.html