tnblog
首页
视频
资源
登录

.NET MVC EF框架中Left Join的SelectMany原理

7434人阅读 2019/10/18 11:15 总访问:115054 评论:0 收藏:0 手机
分类: .NET MVC

下列代码为实现Left join 查询数据库,如果在调用SelectMany方法之前已经ToList,返回之后就结束操作数据库了,SelectMany 只是来解析返回集合中的集合,如果在调用SelectMany方法之前没有ToList,SelectMany相当于来在SQ语句中添加条件约束。

var result = oae.userinfo.GroupJoin(oae.noteinfo, a => a.userId, b => b.userId, (u, n) => new
            {
                userId = u.userId,
                userName = u.userName,
                notes = n
            }).ToList().SelectMany(a => a.notes.DefaultIfEmpty(), (a, b) => new
            {
                userId = a.userId,
                userName = a.userName,
                noteRemark = b.noteRemark
            }).ToList();

咱们可以看看在ToList之前和之后的SelectMany的结构(F12即可查看)

ToList之前的SelectMany:

public static IQueryable<TResult> SelectMany<TSource, TCollection, TResult>(this IQueryable<TSource> source, Expression<Func<TSource, IEnumerable<TCollection>>> collectionSelector, Expression<Func<TSource, TCollection, TResult>> resultSelector);

ToList之后的SelectMany:

public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector);



这样我们就可以看到是截然不同的,那么下面就来说说在ToList之后SelectMany的原理(相当于自己写一个和SelectMany一样的扩展方法)

写扩展方法类和方法必须是静态的(static)

IEnumberable<TRsult> 为方法MySelectMany的最终返回值类型

this IEnumberable<TSource> source 为调用方法的集合本身

IEnumerable<TCollection> 为集合中的集合的类型 通过collectionSelector方法可以取到

最终返回值就是TResult它本身

代码如下:

public static class IEnumberExtands
    {
        public static IEnumerable<TResult> MySelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)
        {
            //实例化最终要返回的集合
            List<TResult> tresultList = new List<TResult>();
            //第一次遍历集合
            foreach (TSource tsource in source)
            {
                //拿到在上一层集合中的集合
                IEnumerable<TCollection> subList = collectionSelector(tsource);
                foreach (TCollection item in subList)
                {
                    //返回的就是TResult本身
                    TResult result = resultSelector(tsource, item);
                    tresultList.Add(result);
                }
            }
            return tresultList;
        }
    }

上面的原理是自我理解的,希望对各位看官有帮助。

评价
网络上你重拳出击,现实中你刚上初一
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术