菜的像徐坤
排名
7
文章
192
粉丝
15
评论
16
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

EF SelectMarry实现原理

6434人阅读 2021/3/24 11:30 总访问:1017616 评论:0 收藏:0 手机
分类: EF

前言

  SelectMarry实现的原理其实就是把一对多,或者集合解析成一对一
         内部核心原理就是通过两个循环解析

解析方法

  1.  //学生表(Scroe字段是一对多字段,包含空数据)
  2.   List<GroupJoinClass> database = oaentities.Userchild.GroupJoin(oaentities.UserScroe, a => a.sid, b => b.ScroeUser, (a, b) => new GroupJoinClass
  3.             {
  4.               sid = a.sid,
  5.               Username = a.Username,
  6.               Fathername = a.Fid,
  7.               scroe = b
  8.             }).ToList();
  9.  
  10.  
  11.  //定义集合接收
  12.  List<OneByOneClass> rar = new List<OneByOneClass>();
  13.          //循环遍历学生表
  14.             foreach (GroupJoinClass item in database)
  15.             {
  16.                 //再循环遍历一对多的字段使其变成一对一的对象
  17.                 foreach (UserScroe item2 in item.scroe)
  18.                 {
  19.                      //实例化空对象接收数据
  20.                     OneByOneClass onebyone = new OneByOneClass();
  21.                     //属性赋值
  22.                     onebyone.sid = item.sid;
  23.                     onebyone.username = item.Username;
  24.                     //为空验证(为空就跳过)
  25.                     if (item.scroe != null)
  26.                     {
  27.                         onebyone.Scroename = item2.ScroeName;
  28.                         onebyone.Scroenumber = item2.ScroeNum;
  29.                     }
  30.                     //将数据添加
  31.                     rar.Add(onebyone);
  32.                 }
  33.             }

OneByOneClass对象部分

  1.  public partial class OneByOneClass
  2.     {
  3.         public int sid { getset; }
  4.         public string username { getset; }
  5.         public string Scroename { getset; }
  6.         public string Scroenumber { getset; }
  7.     }


自定义扩展方法

  1.             //list的父类                                                                                                                                                                                                         给泛型添加约束才能new出来
  2.         public static IEnumerable<TResult> MySelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector) where TCollection:new() where TResult:new()
  3.         {
  4.             //定义泛型集合接收
  5.             List<TResult> rar = new List<TResult>();
  6.             //循环主表(用户传输的第一个参数)
  7.             foreach (TSource item in source)
  8.             {
  9.                 //循环用户给出条件的字段(需要解析的字段)(一对多的部分)
  10.                 foreach (TCollection newitem in collectionSelector(item))
  11.                 {
  12.                     //null验证(定义一个空的对象,因为是分数可能为空,所以空数据点不出来,用一个空对象代替就可以避免报错)
  13.                     TCollection t2 = new TCollection();
  14.                     //定义一个空的泛型(装用户赋的值)
  15.                     TResult Userjoin = new TResult();
  16.                     //null验证(有数据传数据,为空传空对象)
  17.                     if (newitem == null)
  18.                     {
  19.                          Userjoin = resultSelector(item, t2);
  20.                     }
  21.                     else
  22.                     {
  23.                          Userjoin = resultSelector(item, newitem);
  24.                     }
  25.                     //将用户输入的数据添加进List
  26.                     rar.Add(Userjoin);
  27.                 }
  28.             }
  29.             return rar;
  30.         }

通过学生表点出扩展方法(与系统自带方法基本一致)

  1.    
  2.    var database = oaentities.Userchild.GroupJoin(oaentities.Userfather, a => a.Fid, b => b.Cid, (user, parent) => new
  3.             {
  4.                 user = user,
  5.                 Father = parent
  6.             }).MySelectMany(a => a.Father.DefaultIfEmpty(), (last, parent) => new LeftJoinDatabeseController {
  7.             sid = last.user.sid,
  8.             Username = last.user.Username,
  9.             Fathername = parent.Fathername
  10.             });
  11.             
  12.    //现在的database就是一个一对一的对象


评价