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 AS [C1]
两个生成代码的含义是什么?为什么LINQ会生成该代码?我有以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部件只是以允许查询以从任一不同的表或表内的不同行的到来,全部在相同的结果相同的列名之间进行区分.
归档时间: |
|
查看次数: |
1694 次 |
最近记录: |