Linq vs Lambda-Expressions查询执行和执行查询中的"1 AS [C1]"修复

Chu*_*ris 2 c# sql linq lambda linq-to-entities

我有用LINQ和Lambda表达式编写的相同查询:

LINQ:

var str = (from userInfo in context.UserInfos
 join user in context.Users on userInfo.UserId equals user.UserID
 join membership in context.Memberships on userInfo.UserId equals membership.UserId
 where user.UserName == userName
 select new UserData
  {
     UserName = user.UserName,
     FirstName = userInfo.FirstName,
     LastName = userInfo.LastName,
     Email = membership.Email,
     UserId = user.UserID
 });
Run Code Online (Sandbox Code Playgroud)

LAMBDA表达式:

var str1 = context.Users.Where(p => p.UserName == userName).Select(p => new
            {
                UserName = p.UserName,
                FirstName = p.UserInfo.FirstName,
                LastName = p.UserInfo.LastName,
                Email = p.UserInfo.Membership.Email,
                UserId = p.UserID
            });
Run Code Online (Sandbox Code Playgroud)

所以我查看了它们生成的代码,看起来LINQ查询生成的代码比使用Lambda-Expressions的代码更灵活.

LINQ:

SELECT 
1 AS [C1], 
[Extent2].[UserName] AS [UserName], 
[Extent1].[FirstName] AS [FirstName], 
[Extent1].[LastName] AS [LastName], 
[Extent3].[Email] AS [Email], 
[Extent2].[UserID] AS [UserID]
FROM   [dbo].[UserInfo] AS [Extent1]
INNER JOIN [dbo].[aspnet_Users] AS [Extent2] ON [Extent1].[UserId] = [Extent2].[UserID]
INNER JOIN [dbo].[aspnet_Membership] AS [Extent3] ON [Extent1].[UserId] = [Extent3].[UserId]
WHERE [Extent2].[UserName] = @p__linq__0
Run Code Online (Sandbox Code Playgroud)

LAMBDA表达式:

SELECT 
1 AS [C1], 
[Extent1].[UserName] AS [UserName], 
[Extent3].[FirstName] AS [FirstName], 
[Extent4].[LastName] AS [LastName], 
[Extent6].[Email] AS [Email], 
[Extent1].[UserID] AS [UserID]
FROM      [dbo].[aspnet_Users] AS [Extent1]
LEFT OUTER JOIN [dbo].[UserInfo] AS [Extent2] ON [Extent1].[UserID] = [Extent2].[UserId]
LEFT OUTER JOIN [dbo].[UserInfo] AS [Extent3] ON [Extent2].[UserId] = [Extent3].[UserId]
LEFT OUTER JOIN [dbo].[UserInfo] AS [Extent4] ON [Extent2].[UserId] = [Extent4].[UserId]
LEFT OUTER JOIN [dbo].[UserInfo] AS [Extent5] ON [Extent2].[UserId] = [Extent5].[UserId]
LEFT OUTER JOIN [dbo].[aspnet_Membership] AS [Extent6] ON [Extent5].[UserId] = [Extent6].[UserId]
WHERE [Extent1].[UserName] = @p__linq__0
Run Code Online (Sandbox Code Playgroud)

所以我有两个问题:

  1. 似乎LINQ查询生成了更灵活的代码,我想它会更快地运行.这是否意味着连接表达式更适合在标准LINQ查询中编写?
  2. 1 AS [C1]两个生成代码的含义是什么?为什么LINQ会生成该代码?

Jon*_*eet 7

我有以LINQ和Lambda表达式方式编写的相同查询.

不,你没有.您的查询表达式有两个内连接; 您的方法调用符号版本没有.此外,您的查询表达式UserData在其select子句中构建一个新对象,而您的方法调用版本使用匿名类型.

如果要使用方法表示法编写查询表达式版本,则需要引入透明标识符 - 它会变得混乱(通常在方法调用表示法中进行连接).您的方法调用表示法很容易表达为查询表达式:

var str = from userInfo in context.UserInfos
          where user.UserName == userName
          select new
          {
              UserName = p.UserName,
              FirstName = p.UserInfo.FirstName,
              LastName = p.UserInfo.LastName,
              Email = p.UserInfo.Membership.Email,
              UserId = p.UserID
          };
Run Code Online (Sandbox Code Playgroud)

AS在生成的SQL部件只是以允许查询以从任一不同的表或表内的不同行的到来,全部在相同的结果相同的列名之间进行区分.

  • @ChuckNorris:使用或不使用查询表达式没有区别; 他们编译成相同的代码.使用连接*可以*使查询在SQL中更快地执行 - 查看查询分析器.使用连接几乎*肯定*帮助LINQ to Objects.最终,*正确性*是最重要的 - 使用最可读地表达您想要的查询. (2认同)