linq小笔记;
1.比较LINQ to Entities的AsQueryable和AsEnumerable方法
C#程序:
{
var query = (from item in context.Users.AsQueryable()
where item.id > 10
select item.id).ToList();
var query2 = (from item in context.Users.AsEnumerable()
where item.id > 10
select item.id).ToList();
}
服务器端sql:
Select
[Extent1].[id] AS [id]
FROM [dbo].[User] AS [Extent1]
Where [Extent1].[id] > 10
--AsEnumerable
Select
[Extent1].[id] AS [id],
[Extent1].[usn] AS [usn],
[Extent1].[pwd] AS [pwd],
[Extent1].[created] AS [created]
FROM [dbo].[User] AS [Extent1]
例二:
C#程序:
{
var query = (from item in context.Users.AsQueryable()
where item.id > 10
orderby item.id ascending
select item.id).Skip(20).Take(20).ToList();
var query2 = (from item in context.Users.AsEnumerable()
where item.id > 10
orderby item.id ascending
select item.id).Skip(20).Take(20).ToList();
}
服务器端sql:
Select TOP (20)
[Filter1].[id] AS [id]
FROM ( Select [Extent1].[id] AS [id], row_number() OVER (ORDER BY [Extent1].[id] ASC) AS [row_number]
FROM [dbo].[User] AS [Extent1]
Where [Extent1].[id] > 10
) AS [Filter1]
Where [Filter1].[row_number] > 20
orDER BY [Filter1].[id] ASC
--AsEnumerable
Select
[Extent1].[id] AS [id],
[Extent1].[usn] AS [usn],
[Extent1].[pwd] AS [pwd],
[Extent1].[created] AS [created]
FROM [dbo].[User] AS [Extent1]
小结
AsQueryable是在数据库中查询再返回数据,AsEnumerable是从数据库读取全部数据再在程序中查询,其效果和ToList相同。
在使用LINQ 进行数据集操作时,LINQ 不能直接从数据集对象中查询,因为数据集对象不支持LINQ 查询,所以需要使用AsEnumerable 方法返回一个泛型的对象以支持LINQ 的查询操作。
.AsEnumerable()是延迟执行的,实际上什么都没有发生,当真正使用对象的时候(例如调用:First, Single, ToList....的时候)才执行.
IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable<T> 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令,
它并不是把所有数据都加载到内存里来才进行条件过滤。IEnumerable跑的是Linq to Object,强制从数据库中读取所有数据到内存先
2.LINQ to Entities多条件动态查询实现
//多条件条件查询的方法;
List<fuck> fucks = new List<fuck>() { new fuck() { Id = }, new fuck() { Id = }, new fuck() { Id = }, new fuck() { Id = } };
List<Student> Students = new List<Student>() { new Student() { Id = , Name = "jack", fucks = fucks }, new Student() { Id = , Name = "tom" }, new Student() { Id = , Name = "rose" } }; //这里有tmd的一个重复的数据滴呀;
var query = Students.AsQueryable();
string name = "";
int id = ;
if (!string.IsNullOrEmpty(name))
{
query.Where(o => o.Name == name); //多亏它它查询时候的延迟功能,才能很好地将多添加组合查询;
}
if (id != )
{
query.Where(o => o.Id == id); //这里我么就暂时不tolist了诶呀;
} //最后我们再来tolist
var result = query.Select(o=>o).ToList();//这里来进行我们的tolist
在不需要对Where出来的数据进行操作时,直接使用Enumerable,提高性能是有道理的。但需要对Enumerable数据进行更多的处理时,是不是因为变量引用的关系,后续的数据操作还是引用到原始的数据源上
如果对没有继承 IQueryable 接口的类型使用 AsQueryable(), 会转换类型, 如下,
int[] array = new { 1, 2, 4, 5};
var enumArray = array.AsQueryable();
因为 Array 只继承了 IEnumerable, 没有继承 IQueryable, 所以会发生类型转换. 这种情况下使用没有任何作用, 因为 IQueryable 没有声明任何新方法.
本人更多是在单元测试中使用 AsQueryable() 模拟 EF data provider 返回的数据
调用 ToList() 会立刻查询并保存结果, 而不会等到迭代时才查询. 作用和 lazy load 是对立的.
在需要得到完整结果后, 再处理的场景, 需要使用 ToList().
例如, 在返回mvc ActionResult 的时候, 要先使用 ToList(), 再作为 model 传给 view
linq小笔记;的更多相关文章
- 转:【iOS开发每日小笔记(十一)】iOS8更新留下的“坑” NSAttributedString设置下划线 NSUnderlineStyleAttributeName 属性必须为NSNumber
http://www.bubuko.com/infodetail-382485.html 标签:des class style 代码 html 使用 问题 文件 数据 ...
- 小笔记:Timer定时间隔时间操作
小笔记:Timer定时间隔时间操作,后面有时间再补充和完善: public class TimingSvc { /// <summary> /// 定时器,执行定时任务 /// </ ...
- 关于 linux中TCP数据包(SKB)序列号的小笔记
关于 SKB序列号的小笔记 为了修改TCP协议,现在遇到了要改动tcp分组的序列号,但是只是在tcp_sendmsg函数中找到了SKB的end_seq 一直没有找到seq 不清楚在那里初始化了,就 ...
- Linux下postgres9.4 版本的单机版安装小笔记
1.添加RPMyum install https://download.postgresql.org/pub/repos/yum/9.4/redhat/rhel-7-x86_64/pgdg-redha ...
- C# LINQ学习笔记一:走进LINQ的世界
本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5832322.html,记录一下学习过程以备后续查用. LINQ 简介: 语言集成查询(LINQ)是Vi ...
- linq学习笔记
最近在学习linq的一些基础知识,看了c#高级编程及阅读了园子内部几篇优秀的博文,有所体会,感觉应该记录下来,作为以后复习使用.都是一些最基础的知识,大致分为三个部分:linq预备知识:linq查询: ...
- 深入剖析Nginx一点小笔记
前几天在图书馆看书,恰好看到这本<深入剖析nginx>,花了快一周的时间看完了这本书,写点笔记心得便于以后复习. 以前对nginx的认识就只是停留在一个反向代理服务器上.百度了一下ngin ...
- Linq用法笔记
一.什么是Linq? LINQ即Language Integrated Query(语言集成查询),LINQ是集成到C#和Visual Basic.NET这些语言中用于提供查询数据能力的一个新特性. ...
- Linq小整理
Linq(Language Integrated Query)中文翻译为语言集成查询 (1)源起 .net的设计者在类库中定义了一系列的扩展方法 来方便用户操作集合对象 这些扩展方法构成了LINQ的查 ...
随机推荐
- 使用CSS/JS代码修改博客模板plus
之前对CSS/JavaScript了解还不深,只是把模板的CSS胡乱修改了几个属性.最近正好也在做一个网站的前端,学习了不少东西,再来改一改~ 上次最后之所以铩羽而归,是因为从CSS里找不到那些#和. ...
- BZOJ2080 : [Poi2010]Railway
如果存在$k$使得$i<j<k$,且$a[k]<a[i]<a[j]$,那么$i$和$j$不能在一个栈中. 设$b[i]=\min(a[i..n])$,如果$b[j]<a[ ...
- vwampserver2.5-apache2.4.9允许外部访问的配置
打开..\wamp\bin\apache\apache2.4.9\conf\httpd.conf配置文件, <Directory "c:/wamp/www/"> ...
- BZOJ 1086 & 类树的分块
题意: “余”人国的国王想重新编制他的 国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个 不同的城市之间 ...
- hdu1019 Least Common Multiple
Problem Description The least common multiple (LCM) of a set of positive integers is the smallest po ...
- Leetcode Add Binary
Given two binary strings, return their sum (also a binary string). For example,a = "11"b = ...
- NOI 题库 1792
1792 迷宫 描述 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行.同时当Exten ...
- 【bzoj2049】[Sdoi2008]Cave 洞穴勘测 link-cut-tree
2016-05-30 11:04:51 学习了link-cut-tree 二中神犇封禹的讲义感觉讲的超级清晰易懂啊(没有的可以q窝 算是模板吧 #include<bits/stdc++.h&g ...
- 51nod百度之星2016练习赛
今天看了看51nod发现有这样一个练习赛,就做了做.因为实力太弱想不出E题,各位神犇勿D. (5.26UPD:E题想粗来了) A 区间交 不难发现若干线段[li,ri]的交就是[max(li),min ...
- HDU 5876 关于补图的bfs
1.HDU 5876 Sparse Graph 2.总结:好题,把STL都过了一遍 题意:n个点组成的完全图,删去m条边,求点s到其余n-1个点的最短距离. 思路:把点分为两个集合,A为所有没有到达 ...