排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
分类:
EF
前言
SelectMarry实现的原理其实就是把一对多,或者集合解析成一对一
内部核心原理就是通过两个循环解析
解析方法
//学生表(Scroe字段是一对多字段,包含空数据) List<GroupJoinClass> database = oaentities.Userchild.GroupJoin(oaentities.UserScroe, a => a.sid, b => b.ScroeUser, (a, b) => new GroupJoinClass { sid = a.sid, Username = a.Username, Fathername = a.Fid, scroe = b }).ToList(); //定义集合接收 List<OneByOneClass> rar = new List<OneByOneClass>(); //循环遍历学生表 foreach (GroupJoinClass item in database) { //再循环遍历一对多的字段使其变成一对一的对象 foreach (UserScroe item2 in item.scroe) { //实例化空对象接收数据 OneByOneClass onebyone = new OneByOneClass(); //属性赋值 onebyone.sid = item.sid; onebyone.username = item.Username; //为空验证(为空就跳过) if (item.scroe != null) { onebyone.Scroename = item2.ScroeName; onebyone.Scroenumber = item2.ScroeNum; } //将数据添加 rar.Add(onebyone); } }
OneByOneClass对象部分
public partial class OneByOneClass { public int sid { get; set; } public string username { get; set; } public string Scroename { get; set; } public string Scroenumber { get; set; } }
自定义扩展方法
//list的父类 给泛型添加约束才能new出来 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() { //定义泛型集合接收 List<TResult> rar = new List<TResult>(); //循环主表(用户传输的第一个参数) foreach (TSource item in source) { //循环用户给出条件的字段(需要解析的字段)(一对多的部分) foreach (TCollection newitem in collectionSelector(item)) { //null验证(定义一个空的对象,因为是分数可能为空,所以空数据点不出来,用一个空对象代替就可以避免报错) TCollection t2 = new TCollection(); //定义一个空的泛型(装用户赋的值) TResult Userjoin = new TResult(); //null验证(有数据传数据,为空传空对象) if (newitem == null) { Userjoin = resultSelector(item, t2); } else { Userjoin = resultSelector(item, newitem); } //将用户输入的数据添加进List rar.Add(Userjoin); } } return rar; }
通过学生表点出扩展方法(与系统自带方法基本一致)
var database = oaentities.Userchild.GroupJoin(oaentities.Userfather, a => a.Fid, b => b.Cid, (user, parent) => new { user = user, Father = parent }).MySelectMany(a => a.Father.DefaultIfEmpty(), (last, parent) => new LeftJoinDatabeseController { sid = last.user.sid, Username = last.user.Username, Fathername = parent.Fathername }); //现在的database就是一个一对一的对象
评价