一个简单问题引发对IEnumerable和IQueryable的思考
问题概述:
首先看下图,有客户表和客户负责人表关系是多对多,访问数据库使用的是EF所以这里我们开启了延迟加载,需求就是将每个客户的所有负责人逗号拼接显示在负责人这一栏位,
对你没看错需求就是这么简单如果是写sql也许我们会去用两个循环去做,问题是要用linq实现。
这是我起初的写法:
首先申明这个resultlist接收到的类型本该是Iqueryable<Customer> 但我们要放入PrincipalNames字段(逗号拼接显示字段)所以接收的是匿名类型 这样写报的错是:
大概意思:LINQ实体不能识别方法的系统。字符串连接(系统。system . String[])字符串,的方法,这种方法不能被翻译成一个存储表达式
然后各种百度谷歌发现其原因是将这段linq翻译成sql的时候string.Join()方法不被识别也就是没法翻译,这时我就郁闷了,甚至怀疑linq
能不能实现这样的需求、
中途有想过不用linq实现,用两个循环赋值去实现实现:做法就是先循环客户信息再循环客户下的负责人将负责人的名称拼接赋值给客户的负责人
但由于前面客户是匿名类型PrincipalNames并不存在客户表中所以不能赋值,so解决方案就是还要在建立一个含有PrincipalNames字段的视图模型
这样才能循环后去赋值!我也是醉了,咋这麻烦。
又想了想不可能啊 这样的需求很正常不是吗linq怎么可能不能实现,继续找~
在博客园找都一篇阐述IEnumerable和IQueryable区别的文章:http://www.cnblogs.com/FlyEdward/archive/2010/02/01/Linq_ExpressionTree2.html
感觉有点意思继续找类似的文章佐证,发现还真是这东西在作怪 ,先看看正确的查询写法:
重点就在我划红线的地方这样写resultlist接收的类型是IEnumberable<Customer>类型这样写其会先将数据全部查入内存中在进行查询,并没有将
后面的条件也就是匿名类里面的东西包括string.Join方法翻译成sql 这样就不会出现之前不能string.Join()方法不识别的问题了,OK解决!
总结:
IQueryable继承自IEnumerable,所以对于数据遍历来说,它们没有区别。
1.IEnumerable查询必须在本地执行.并且执行查询前我们必须把所有的数据加载到本地.而且更多的时候.加载的数据有大量的数据是我们不需要的无效数据.但是我们却不得不传输更多的数据.做更多的无用功。
使用IEnumerable,所有对于IEnumerable的过滤,排序等操作,都是在内存中发生的。也就是说数据已经从数据库中获取到了内存中,只是在内存中进行过滤和排序操作。
2.IQueryable却总能只提供你所需要的数 据.大大减少了数据的传输
IQueryable的优势是它有表达式树,所有对于IQueryable的过滤,排序等操作,都会先缓存到表达式树中,只有当真正遍历发生的时候,才会将表达式树由IQueryProvider执行获取数据操作。
以上观点属个人领悟,若有问题欢迎纠正。
一个简单问题引发对IEnumerable和IQueryable的思考的更多相关文章
- 一个简单的synchronized多线程问题、梳理与思考
一个程序,多个线程同时操作一个变量,给这个变量+1().功能很简单,可是怎么样去实现呢?这其中涉及到了哪些问题? 最基础想法 见代码: public class Test extends Thread ...
- 一个简单算法题引发的思考<DNA sorting>(about cin/template/new etc)
首先是昨天在北京大学oj网上看到一个简单的算法题目,虽然简单,但是如何完成一段高效.简洁.让人容易看懂的代码对于我这个基础不好,刚刚进入计算机行业的小白来说还是有意义的.而且在写代码的过程中,会发现自 ...
- 大话JS面向对象之扩展篇 面向对象与面向过程之间的博弈论(OO Vs 过程)------(一个简单的实例引发的沉思)
一,总体概要 1,笔者浅谈 我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭(面向对象式编程因为引入了类.对象.实例等概念,非常贴合人类对于世间万物的认 ...
- 一个简单的特效引发的大战之移动开发中我为什么放弃jquery mobile
我本想安静的做一个美男子,可是,老板不涨工资,反而,一月不如一月. 我为什么放弃jquery mobile插件选择自己写特效? 在开发中大家都知道效率很重要,一个好的工具可以在开发中大大提升效率,工作 ...
- [.NET] 一步步打造一个简单的 MVC 网站 - BooksStore(一)
一步步打造一个简单的 MVC 网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore 简介 主 ...
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(四)
一步步打造一个简单的 MVC 电商网站 - BooksStore(四) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...
- [.NET] 一步步打造一个简单的 MVC 电商网站 - BooksStore(一)
一步步打造一个简单的 MVC 电商网站 - BooksStore(一) 本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore &l ...
- IEnumerable和IQueryable的区别以及背后的ExpressionTree表达式树
关于IEnumerable和IQueryable的区别,这事还要从泛型委托Func<T>说起.来看一个简单的泛型委托例子: class Program { static void Main ...
- 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器
1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...
随机推荐
- kali linux之手动漏洞挖掘一
默认安装漏洞 phpmyadmin/setup默认安装 ubuntu/debian默认安装php5-cgi phpmyadmin/setup默认安装 使用?-d+allow_url_include%3 ...
- 关于Java中SQL语句的拼接规则
实现目标语句是这个注意,这里的java变量是idd int idd; String sql = "SELECT id, piUrl FROM picinfos WHERE id BETWEE ...
- 题解 P1534 【不高兴的津津(升级版)】
题目链接 不算太难.就是题目有歧义. wa了好几次才发现.上一天要是小于8的话.结算是昨天一个负值在加上今天课时数.再减去8.233.... 而不是上一天小于8个小时.就清零了..大家要注意(ps:题 ...
- 【FAQ】服务下线
原因:磁盘已满
- springboot集成巨杉数据库
springboot倾向于约定优于配置,所以大大简化了搭建项目的流程,包括各种数据源的配置,接下来就和大家分享下最近用到的巨杉数据源连接池的配置 1.现在配置文件中定义巨杉连接池的各种连接信息,至于每 ...
- 使用C#实现SSLSocket加密通讯 Https
原文链接 http://blog.csdn.net/wuyb_2004/article/details/51393290 using System; using System.Collections; ...
- AVFoundation 文本播报
#import <Foundation/Foundation.h> #import <AVFoundation/AVFoundation.h> @interface Speak ...
- MAC office2016 安装及激活(试了一下,靠谱, 非常感谢原作者)
转载地址:https://blog.csdn.net/jxq0816/article/details/77248462 非常感谢原作者. 一.安装包下载地址 http://officecdn.micr ...
- requests库安装
1.运行cmd输入pip install requests C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts ...
- LeetCode记录之9——Palindrome Number
LeetCode真是个好东西,本来闲了一下午不想看书,感觉太荒废时间了就来刷一道题.能力有限,先把easy的题目给刷完. Determine whether an integer is a palin ...