Linq多表查询

Linq多表查询

  • 内连接
    • 直接join表
 				var query2 = from a in Table_a
                           //连接表b
                           join b in Table_b  on a.BId equals b.Id into Table_b_temps
                            from bn in Table_b_temps   
                           //连接表c
                           join c in Table_c on b.Cid  equals c.id into Table_c_temps
                           from cn in Table_c_temps                                                      
                           //条件
                           where a.id ==12                               
                          //从表中拿到所需要的
                           select new
                         {
                           AId=a.Id
                           BId=bn.Id
                           CId=cn .Id          
                         }; 
  • 左连接
    • 即以左边的表为标准 左边的表数据有则显示,无的情况下则不显示
    • 当左表有数据,右表无数据时会展示出来,右表的字段为空
    • 当左表无数据时,右表有数据的情况下即不会展示
    • 关键字为DefaultIfEmpty() 后面取值的时候就用三元表达式来判断
			 var leftJoin = from a in Table_a
                           //连接表b
                           join b in Table_b  on a.BId equals b.Id
                           from bn in Table_b_temps  
                           //以b表为中心表c
                           join c in Table_c on bn.Cid  equals c.id into Table_c_temps
                           from cn in Table_c_temps.DefaultIfEmpty()                                                      
                           //条件
                           where a.id ==12                               
                          //从表中拿到所需要的
                           select new
                         {
                           AId=a.Id
                           BId=bn.Id
                           CId=cn!=null ?cn.Id:0         
                         };                     
  • 多条件连接
  • 即Join条件多个的情况下,不如说现在应用一个新的表,但是条件是要与那2个表相连,这时候条件不是一个了。
  • on new { AId = a.Id, BId = b.id } equals new { AId = c.Id, BId = c.id } into Table_c_temps
 			var list = from a in Table_a
                        //连接表b
                        join b in Table_b  on a.BId equals b.Id
                        from bn in Table_b_temps  
                        //连接表c
                        join c in Table_c 
                        //将条件全放进去 相对应
                        on new { AId = a.Id, BId = b.id  } equals new { AId = c.aId, BId = c.bId  } into Table_c_temps
                        from cn in Table_c_temps.DefaultIfEmpty()                                                      
                        //条件
                        where a.id ==12                               
                       //从表中拿到所需要的
                        select new
                      {
                        AId=a.Id
                        BId=bn.Id
                        CId=cn!=null ?cn.Id:0         
                      };                     
  • 分组
  • 将重复的数据过滤

var ChildPhotoList = (from l in list
                     group l by new { l.Id, l.Name,, l.StartDate, l.EndDate, l.Url, l.Img }
                     into p
                     select new
                     {
                         Id = p.Key.Id,
                         Url = p.Key.Url,
                         EndDate = p.Key.EndDate,
                         StartDate = p.Key.StartDate,
                         Img = p.Key.Img,               
                         Name = p.Key.Name,
                         //将未分组的可以弄成一个List集合
                         Items = p.Select(p => new 定义的类
                         {
                             ChildId = p.ChildId,
                             ChildName = p.ChildName,
                         }).ToList(),
                     }).ToList();                   
  • 合并
  • 当条件查询的结果需要合并时可以这样

            var l1 = (from s in da.linqname
                   	  where s.name.Contains(姓名关键字)
                  	 select s).ToList();
            var l2 = (from s in da.linqname
                      orderby s.Phone.Contains(手机号关键字)
                      select s).ToList();
          //合并2次的结果         
     	   var item=  l1.Concat(l2);

            foreach (var l in ll)
            {
                Console.Write(l.names+"\n");
            } 

合并的话 只要数据类型和顺序是一样的可以组合在一起,但是可能存在相同数据,可以将其进行分组筛选

你可能感兴趣的:(linq)