tnblog
首页
视频
资源
登录

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

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

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

  1. var result = oae.userinfo.GroupJoin(oae.noteinfo, a => a.userId, b => b.userId, (u, n) => new
  2.             {
  3.                 userId = u.userId,
  4.                 userName = u.userName,
  5.                 notes = n
  6.             }).ToList().SelectMany(a => a.notes.DefaultIfEmpty(), (a, b) => new
  7.             {
  8.                 userId = a.userId,
  9.                 userName = a.userName,
  10.                 noteRemark = b.noteRemark
  11.             }).ToList();

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

ToList之前的SelectMany:

  1. 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:

  1. 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它本身

代码如下:

  1. public static class IEnumberExtands
  2.     {
  3.         public static IEnumerable<TResult> MySelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector)
  4.         {
  5.             //实例化最终要返回的集合
  6.             List<TResult> tresultList = new List<TResult>();
  7.             //第一次遍历集合
  8.             foreach (TSource tsource in source)
  9.             {
  10.                 //拿到在上一层集合中的集合
  11.                 IEnumerable<TCollection> subList = collectionSelector(tsource);
  12.                 foreach (TCollection item in subList)
  13.                 {
  14.                     //返回的就是TResult本身
  15.                     TResult result = resultSelector(tsource, item);
  16.                     tresultList.Add(result);
  17.                 }
  18.             }
  19.             return tresultList;
  20.         }
  21.     }

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

评价

.net MVC EF 小规模权限管理

《再别康桥》&quot;轻轻地我走了,正如我轻轻地来,我挥一挥衣袖,不带走一片云彩” ——徐志摩我们想要做...

在abp框架中用插件生成复选框(神坑)

前言:hello ,各位老铁们 五一收假了 也该收心了 今天和小付一起来看看我遇到的问题吧!今天要说的是用插件生成复选框上次...

.net MVC 中lamdba实现Left Join

1、left join 用GroupJoin来实现,join的返回结果为一对一,GroupJoin返回结果为一对多,相当于集合中还有集合publicAction...

ef 三表join三表Left Join

EF三表join:sql写法://sql List&lt;UserScoreViewModel3&gt;ulist=oae.Database.SqlQuery&lt;UserScoreViewModel3&gt;(@...

ef 两表Left Join

linq写法://linq写法 varquery=(fromuinoae.Users joinpinoae.User_Parentonu.Idequalsp.UsersIdintojointemp fromleft...

cAPS.net 保存base64位格式图片

publicvoidUpload() { //取出图片对应的base64位字符 stringimgBase=Request[&quot;imgBase&quot;]; //c#里边的base6...

使用OLEDB读取不同版本Excel连接字符串设置

使用OleBD读取excel的时候,excel不同的版本,连接字符串的写法也会不一样。///&lt;summary&gt; ///读取excel ///&lt;/su...

vs2017 对 COM 组件调用返回了错误 HRESULT E_FAIL

vs2017添加引用报错 对 COM 组件的调用返回了错误 HRESULT E_FAIL 1.以管理员身份打开vs2017开发人员命令指示符 2...

分布式服务架构与微服务架构概念区别与联系

分布式:分散压力。微服务:分散能力。当下理解分布式:不同模块部署在不同服务器上作用:分布式解决网站高并发带来问题集...

分布式-微服务-集群区别

1.分布式将一个大的系统划分为多个业务模块,业务模块分别部署到不同的机器上,各个业务模块之间通过接口进行数据交互。区...

EasyUI弹窗批量修改combogrid下拉框

JS方法//点击弹出批量修改框 UpdateLot:function(){ varrow=$(&quot;#dg&quot;).datagrid(&quot;getChecked&quot;); if(...

js与Controller中分割字符串方法

js: varstr=OpenRule; varstrs=newArray(); strs=str.split(&quot;,&quot;); for(vari=0;i&lt;strs.length;i++){ $(&q...

如何修改重置MD5加密后SQL用户密码

二次开发时,要加一个忘记密码的功能,后台写了修改密码的方法,数据库执行也修改成功,但是登录一直提示密码错误。之所以...

如何修改CSS中存在element.style内联样式

改腾讯地图的时候调整了下样式,发现样式一直存在问题,修改style里面的值,一点用都没有,html中这个值还找不到是在哪里出...

微信交易单号和订单号区别

一般第三方在线支付系统中都会有两类订单号transactionId 为支付系统的订单号,由支付系统生成,并在回调时传回给商户,用...
网络上你重拳出击,现实中你刚上初一
排名
3
文章
317
粉丝
22
评论
14
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
总有一些东西,要用消失来证明珍贵。