LINQ用法總結


之前一直用sql和拉姆達表達式,一直感覺linq不好用。用熟練了感覺期功能好強大,查詢性能例外考究。這里講講基本用法。

內聯查詢:

            var list2 = (from a in db.Role where a.IsDel==true
                         join b in db.UserRole on a.Id equals b.RoleId where b.Id>0
                         where a.Id > 0 
                         select new
                         {
                             a.Id,
                             b.RoleId
                         }
                        ).ToList();

跟蹤sql得到:

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent2].[RoleId] AS [RoleId]
    FROM  [dbo].[Role] AS [Extent1]
    INNER JOIN [dbo].[UserRole] AS [Extent2] ON [Extent1].[Id] = [Extent2].[RoleId]
    WHERE (1 = [Extent1].[IsDel]) AND ([Extent2].[Id] > 0) AND ([Extent1].[Id] > 0)
View Code

左連表查詢:

            var list3 = (from a in db.Role
                         join b in db.UserRole on a.Id equals b.RoleId into temp
                         from ur in temp.DefaultIfEmpty()
                         select new
                         {
                             a.Id,
                             ur.UserId
                         }).ToList();

sql:

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent2].[UserId] AS [UserId]
    FROM  [dbo].[Role] AS [Extent1]
    LEFT OUTER JOIN [dbo].[UserRole] AS [Extent2] ON [Extent1].[Id] = [Extent2].[RoleId]
View Code

order by:

            var list4 = (from a in db.Role
                         join b in db.UserRole on a.Id equals b.RoleId 
                         group a by a.Id into g
                         select new
                         {
                             g.Key,
                             Name=g.Max(x=>x.Name)
                         }).ToList();

sql:

SELECT 
    [GroupBy1].[K1] AS [Id], 
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT 
        [Extent1].[Id] AS [K1], 
        MAX([Extent1].[Name]) AS [A1]
        FROM  [dbo].[Role] AS [Extent1]
        INNER JOIN [dbo].[UserRole] AS [Extent2] ON [Extent1].[Id] = [Extent2].[RoleId]
        GROUP BY [Extent1].[Id]
    )  AS [GroupBy1]
View Code

 

in 查詢:like的查詢和in寫法差不多,都是用Contains

            int[] arr = { 1, 2 };
            var list1 = (from a in db.Role
                         where arr.Contains(a.Id)
                         select new Test
                         {
                             Id = a.Id,
                             list = db.UserRole.Where(x => x.RoleId == a.Id).ToList()
                         }
                       ).ToList();

sql:

SELECT 
    [Project1].[Id] AS [Id], 
    [Project1].[C1] AS [C1], 
    [Project1].[Id1] AS [Id1], 
    [Project1].[UserId] AS [UserId], 
    [Project1].[RoleId] AS [RoleId]
    FROM ( SELECT 
        [Extent1].[Id] AS [Id], 
        [Extent2].[Id] AS [Id1], 
        [Extent2].[UserId] AS [UserId], 
        [Extent2].[RoleId] AS [RoleId], 
        CASE WHEN ([Extent2].[Id] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
        FROM  [dbo].[Role] AS [Extent1]
        LEFT OUTER JOIN [dbo].[UserRole] AS [Extent2] ON [Extent2].[RoleId] = [Extent1].[Id]
        WHERE [Extent1].[Id] IN (1, 2)
    )  AS [Project1]
    ORDER BY [Project1].[Id] ASC, [Project1].[C1] ASC

 

上面in查詢,我研究稍微深入了點,單獨寫查詢看linq是做一次連接還是多長,結果驗證是內部做處理,一次鏈接完成,直接顛覆了我以前的觀念。先記錄到這里


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM