Lambda方式左連接有Linq方式左連接


網上查到的直接使用Join+DefaultIfEmpty的方式是錯誤的,實際生成SQL是兩表先內聯接,然后再LEFT JOIN。經過查證,參考資料,最終得到如下兩種方式的左連接寫法:

        public void TestMethod1()
        {
            MettingEntities db = new MettingEntities();
            
            //LINQ方式
            var query = (from st in db.met_SysItemsClass
                        join cl in db.met_Shortcut on st.ClassID equals cl.ClassID into cls
                        from c in cls.DefaultIfEmpty()
                        select new TestModel
                        {
                            ClassID = st.ClassID,
                            ClassName = st.ClassName,
                            AdminID = c.AdminID
                        }).ToList();

            //Lambda 方式
            var list = db.met_SysItemsClass.GroupJoin(db.met_Shortcut, x => x.ClassID, y => y.ClassID, (x, y) => y.DefaultIfEmpty().Select(z => new TestModel { ClassID = x.ClassID, ClassName = x.ClassName, AdminID = z.AdminID })).SelectMany(x => x).ToList();

        }
    }

    public class TestModel
    {
        public int? AdminID { get; set; }
        public int ClassID { get; set; }
        public string ClassName { get; set; }
    }

兩種方式生成的SQL語句完全相同,如下:

SELECT 
[Extent1].[ClassID] AS [ClassID], 
[Extent1].[ClassName] AS [ClassName], 
[Extent2].[AdminID] AS [AdminID]
FROM  [dbo].[met_SysItemsClass] AS [Extent1]
LEFT OUTER JOIN [dbo].[met_Shortcut] AS [Extent2] ON [Extent1].[ClassID] = [Extent2].[ClassID]

 


免責聲明!

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



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