1. 程式人生 > >C#中 Linq實現多表查詢示例

C#中 Linq實現多表查詢示例

兩表聯查

                //多表查詢示例
                //1、單條件Join
                var bomsetver = ctx.Bomset//主表
                    .Join(
                        ctx.Bomsetver,//外來鍵表
                        a => a.Factory,//主表外來鍵,對應SQL語句“WHERE A.FACTORY=B.FACTORY”
                        b => b.Factory,//外來鍵表主鍵
                        (a, b) => a//查詢結果:顯示主表的所有欄位
                        );
                //2、多條件Join
                var bomsetver2 = ctx.Bomset//主表
                    .Join(
                        ctx.Bomsetver,//外來鍵表
                        a => new { f = a.Factory, id = a.BomSetId },//主表外來鍵,對應SQL語句“WHERE A.FACTORY=B.FACTORY AND A.BOMSETID=B.BOMSETID”
                        b => new { f = b.Factory, id = b.BomSetId },//外來鍵表主鍵
                        (a,b)=>new {a,b }//查詢結果:顯示主表的所有欄位和外來鍵表所有欄位
                        );
                //3、多條件Join,返回部分欄位
                var bomsetver3 = ctx.Bomset//主表
                    .Join(
                        ctx.Bomsetver,//外來鍵表
                        a => new { f = a.Factory, id = a.BomSetId },//主表外來鍵,對應SQL語句“WHERE A.FACTORY=B.FACTORY AND A.BOMSETID=B.BOMSETID”
                        b => new { f = b.Factory, id = b.BomSetId },//外來鍵表主鍵
                        (a, b) => new
                        {
                            AID = a.BomSetId,//主表字段,賦別名
                            a.BomSetDesc,//主表字段
                            BID = b.BomSetId,//外來鍵表字段,賦別名
                            b.BomSetVersion//外來鍵表字段
                        });
                //4、TableA Left Join TableB
                var bomsetver4 = ctx.Bomset
                    .GroupJoin(
                        ctx.Bomsetver,
                        a => new { f = a.Factory, id = a.BomSetId },//主表外來鍵,對應SQL語句“WHERE A.FACTORY=B.FACTORY AND A.BOMSETID=B.BOMSETID”
                        b => new { f = b.Factory, id = b.BomSetId },//外來鍵表主鍵
                        (a, b) => new { AA=a, BB=b })
                    .SelectMany(
                        ab => ab.BB.DefaultIfEmpty(),//Left Join
                        (a,b) => new
                        {
                            AID = a.AA.BomSetId,//主表字段,賦別名
                            a.AA.BomSetDesc,//主表字段
                            BID = b.BomSetId,//外來鍵表字段,賦別名
                            b.BomSetVersion//外來鍵表字段
                        }).ToList();
                //5、TableA Right Join TableB
                //即TableB Left Join TableA

三表聯查:

                //多表查詢示例
                //1、單條件Join
                var bomsetver = ctx.Bomset//主表
                    .Join(
                        ctx.Bomsetver,//外來鍵表
                        a => a.Factory,//主表外來鍵,對應SQL語句“WHERE A.FACTORY=B.FACTORY”
                        b => b.Factory,//外來鍵表主鍵
                        (a, b) => a//查詢結果:顯示主表的所有欄位
                        );
                //2、多條件Join
                var bomsetver2 = ctx.Bomset//主表
                    .Join(
                        ctx.Bomsetver,//外來鍵表
                        a => new { f = a.Factory, id = a.BomSetId },//主表外來鍵,對應SQL語句“WHERE A.FACTORY=B.FACTORY AND A.BOMSETID=B.BOMSETID”
                        b => new { f = b.Factory, id = b.BomSetId },//外來鍵表主鍵
                        (a,b)=>new {a,b }//查詢結果:顯示主表的所有欄位和外來鍵表所有欄位
                        );
                //3、多條件Join,返回部分欄位
                var bomsetver3 = ctx.Bomset//主表
                    .Join(
                        ctx.Bomsetver,//外來鍵表
                        a => new { f = a.Factory, id = a.BomSetId },//主表外來鍵,對應SQL語句“WHERE A.FACTORY=B.FACTORY AND A.BOMSETID=B.BOMSETID”
                        b => new { f = b.Factory, id = b.BomSetId },//外來鍵表主鍵
                        (a, b) => new
                        {
                            AID = a.BomSetId,//主表字段,賦別名
                            a.BomSetDesc,//主表字段
                            BID = b.BomSetId,//外來鍵表字段,賦別名
                            b.BomSetVersion//外來鍵表字段
                        });
                //4、TableA Left Join TableB
                var bomsetver4 = ctx.Bomset
                    .GroupJoin(
                        ctx.Bomsetver,
                        a => new { f = a.Factory, id = a.BomSetId },//主表外來鍵,對應SQL語句“WHERE A.FACTORY=B.FACTORY AND A.BOMSETID=B.BOMSETID”
                        b => new { f = b.Factory, id = b.BomSetId },//外來鍵表主鍵
                        (a, b) => new { AA=a, BB=b })
                    .SelectMany(
                        ab => ab.BB.DefaultIfEmpty(),//Left Join
                        (a,b) => new
                        {
                            AID = a.AA.BomSetId,//主表字段,賦別名
                            a.AA.BomSetDesc,//主表字段
                            BID = b.BomSetId,//外來鍵表字段,賦別名
                            b.BomSetVersion//外來鍵表字段
                        }).ToList();
                //5、TableA Right Join TableB
                //即TableB Left Join TableA
                //6、三表及更多表Join
                var bomsetver6 = ctx.Bomset//主表
                    .Join(
                        ctx.Bomsetver,//外來鍵表一
                        a => new { f = a.Factory, id = a.BomSetId },//主表外來鍵,對應SQL語句“WHERE A.FACTORY=B.FACTORY AND A.BOMSETID=B.BOMSETID”
                        b => new { f = b.Factory, id = b.BomSetId },//外來鍵表主鍵
                        (a, b) => new{ a, b })
                    .Join(
                        ctx.Bomsetmtl,//外來鍵表二
                        a => new { f = a.a.Factory, id = a.a.BomSetId },//主表外來鍵,對應SQL語句“WHERE A.FACTORY=B.FACTORY AND A.BOMSETID=B.BOMSETID”
                        b => new { f = b.Factory, id = b.BomSetId },//外來鍵表主鍵
                        (a, b) => new
                        {
                            AID = a.a.BomSetId,//主表字段,賦別名
                            a.a.BomSetDesc,//主表字段
                            BID = a.b.BomSetId,//外來鍵表字段,賦別名
                            a.b.BomSetVersion,//外來鍵表字段
                            b.PartGrp
                        }).ToList();
                //7、三表及多表Left Join
                var bomsetver7 = ctx.Bomset
                    .GroupJoin(
                        ctx.Bomsetver,
                        a => new { f = a.Factory, id = a.BomSetId },//主表外來鍵,對應SQL語句“WHERE A.FACTORY=B.FACTORY AND A.BOMSETID=B.BOMSETID”
                        b => new { f = b.Factory, id = b.BomSetId },//外來鍵表主鍵
                        (a, b) => new { A1 = a, B1 = b })
                    .SelectMany(
                        ab => ab.B1.DefaultIfEmpty(),//Left Join
                        (a, b) => new { A2=a, B2=b })
                    .GroupJoin(
                        ctx.Bomsetmtl,
                        a => new { f = a.A2.A1.Factory, id = a.A2.A1.BomSetId },//主表外來鍵,對應SQL語句“WHERE A.FACTORY=B.FACTORY AND A.BOMSETID=B.BOMSETID”
                        b => new { f = b.Factory, id = b.BomSetId },//外來鍵表主鍵
                        (a, b) => new { A3 = a, B3 = b }
                        )
                    .SelectMany(
                        ab => ab.B3.DefaultIfEmpty(),//Left Join
                        (a, b) => new
                        {
                            AID = a.A3.A2.A1.BomSetId,//主表字段,賦別名
                            a.A3.A2.A1.BomSetDesc,//主表字段
                            BID = a.A3.B2.BomSetId,//外來鍵表字段,賦別名
                            a.A3.B2.BomSetVersion,//外來鍵表字段
                            b.PartGrp
                        }).ToList(); 

查詢條件拼接:

 var query = ctx.Almmsghis.Where(t => t.TranTime.CompareTo(sFromTime) >= 0 && t.TranTime.CompareTo(sToTime) <= 0);
            if (sTranTime.Trim() != "")
            {
                query = query.Where(t => t.TranTime.CompareTo(sTranTime) <= 0);
            }
            if (sClearFlag.Trim() == "Y")
            {
                query = query.Where(t => t.ClearFlag.CompareTo(sClearFlag) == 0);
            }
            else if (sClearFlag.Trim() == "N")
            {
                query = query.Where(t => t.ClearFlag.CompareTo(" ") == 0);
            }
            if (sAlarmId.Trim() != "")
            {
                query = query.Where(t => t.ClearFlag.CompareTo(sAlarmId) == 0);
            }
            if (sAlarmType.Trim() != " ")
            {
                query = query.Where(t => t.ClearFlag.CompareTo(sAlarmType) == 0);
            }
            if (sLotId.Trim() != "")
            {
                query = query.Where(t => t.ClearFlag.CompareTo(sLotId) == 0);
            }
            if (sResId.Trim() != "")
            {
                query = query.Where(t => t.ClearFlag.CompareTo(sResId) == 0);
            }
            listAlmmsghis = query.OrderByDescending(t => t.TranTime).ToList();