C#编程(六十)----------LINQ的概述
LINQ的概述
LINQ的全名为语言继承查询,是VS2008个.NET3.5版中一款突破性的创新,他再对象领域和数据领域之间架起了一座桥梁.使用LINQ能大大加快对于对象数据等等的查询,加快效率.
由于低版本的VS不支持LINQ,我是用的VS2012,案例如下:
public class ObjDataItem
{
public string Name { get; set; }
public int Value { get; set; }
public DateTime CreateDate { get; set; }
}
然后用一个List<ObjDataItem>objects来存放实例化的ObjDataItem数据.要对这个List<T>进行查找有三种常用的方法来查找, 以下对三种方法进行介绍:
(1)遍历List<T>中的每个ObjDataItem对象,对比是否符合查找条件.
(2)使用List<T>的FindAll方法来潮找符合条件的对象集
(3)使用LINQ来查找符合条件的对象集.
先假设查找条件是ObjDataItem对象的name属性的值是”a”,三种方法查找的代码列出来看看.
(1)遍历查找方法:
List<ObjDataItem> items = new List<ObjDataItem>();
List<ObjDataItem> ObjData = new List<ObjDataItem>();
foreach (ObjDataItem item in items)
{
if (item.Name.ToLower() == "a")
ObjData.Add(item);
}
(2)List<T>的FindAll方法查找
List<T>的FindAll的定义是:
public List<T> FindAll(Predicate<T> match)
其中Predicate是一个委托,表示定义一组条件并确定指定对象是否符合这些条件的方法.
public delegate bool Predicate<T> (T obj)
所以使用List<<T>的FindAll来查找对象就需要编写实例Predicate<T>的方法.
private string _SearchName;
private bool FindByName(ObjDataItem obj)
{
if (obj.Name.ToLower() == _SearchName.ToLower())
return true;
else
return false;
}
然后就可以使用List<T>的FindAll方法来查找符合条件的对象。
public List<ObjDataItem> SearchAllByName(string name)
{
_SearchName = name;
List<ObjDataItem> items = Objects.FindAll(FindByName);
return items;
}
(3)使用LINQ查找对象
使用LINQ来查找符合条件的对象方便了很多,代码如下:
IEnumerable<ObjDataItem> items =
from objdataitem in ObjData.Instance.Objects
where objdataitem.Name.ToLower() == "a"
select objdataitem;
从上面代码来看遍历查找是最好理解的,使用FindAll复杂了不少,而使用LINQ则有点奇怪,看上去有点象SQL语句,这三种方法均能得到正确的结果,但是执行速度却相差很大。通过示例程序计算的时间方法(1)是方法(2)的时间的9倍左右,方法(2)是方法(3)的21倍左右。从面可见使用LINQ是既方便又快速!
如果没有LINQ,筛选出姓名为小明的People对象则需要一个List,然后遍历整个列表,降负荷丁丁雕件的People对象放入列表.到那时有了LINQ,这部分筛选就变得很容易,甚至只要一句话就能完成.如果觉得这个例子不够说明LINQ对生产力有重大贡献的话,那么我们的鸡的皮就会下降百分之五十.
LINQ特指形如from...where..select这样的代码,其返回值是IQueryable<T>或IEnumerable<T>.
LINQ to SQL是.NET3.5内置的一个轻量级O/R Mapping解决方案,可以将数据表映射为实体对象,方便开发人员对数据库的操作.可见, LINQ事实上只是LINQ的一个实现,提供了一个可以查询SQL Server数据库的LINQ Provider.
LINQ Provider是LINQ查询的执行器,标准LINQ语法支持很多的操作符,但是某个具体的LINQ实现可能只支持其中的一部分.在.NET3.5默认提供了三种LINQ Provider,分别是LINQ to Object , LINQ to SQL , LINQ to XML.
LINQ to XXX表示使用LINQ针对XXX这种数据进行查询的解决方案.我们可以定义自己的LINQ Provider,使用我们自定义的查询规则来处理特定数据集.目前网上可以找大哦数十种LINQ Provider,而已经处于beta 3阶段的ADO.NET Framework,最终也会提供了LINQ Provider,叫做 LINQ to Entities.
总结:
LINQ提高效率,方便在特定集合中寻找单条记录,避免使用foreach循环,频繁的数据库查询,可以根据实际的开发案例适当的使用.
开发中需要循环处理一个集合中的每条记录时,我们可以把相应的数据统一放到内存的一个List集合中,然后使用LINQ获取单条记录进行业务处理.这样做的好处是效率提高了.
C#编程(六十)----------LINQ的概述的更多相关文章
- C#高级编程六十九天----DLR简介 .在.NET中使用DLR(转载) 我也来说说Dynamic
DLR 一.近年来,在TIOBE公司每个月发布的编程语言排行榜中,C#总是能挤进前十名,而在最近十年来,C#总体上呈现上升的趋势.C#能取得这样的成绩,有很多因素,其中它在语言特性上的锐意进取让人印象 ...
- C#高级编程六十六天----表达式树总结【转】
https://blog.csdn.net/shanyongxu/article/details/47257139 表达式树总结 基础 表达式树提供了一个将可执行代码转换成数据的方法.如果你要在执行代 ...
- 学习ASP.NET Core Razor 编程系列十六——排序
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十九——分页
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十八——并发解决方案
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- [.net 面向对象编程基础] (20) LINQ使用
[.net 面向对象编程基础] (20) LINQ使用 通过上节LINQ的基础知识的学习,我们可以开始使用LINQ来进行内存数据的查询了,我们上节说了LINQ的定义为:Language Integr ...
随机推荐
- Angularjs里面跨作用域的实战!
好久没有来写博客了,最近一直在用Google的AngularJS,后面我自己简称AngularJS就叫AJ吧! 学习AngularJS一路也是深坑颇多啊--!就不多说了,不过还是建议大家有时间去学下下 ...
- centos7执行 wget命令: command not found的两种解决方法
1.rpm 安装 下载wget的RPM包: http://mirrors.163.com/centos/6.8/os/x86_64/Packages/wget-1.12-8.el6.x86_64.rp ...
- jquery-扩展
jQuery扩展三种方式:$.extend,$.fn.extend,外部文件. 1)jQuery.extend(object) 调用 $.方法 2)jQuery.fn.extend(object) ...
- javaweb笔记三
//写了注解,就不用在web.xml里进行注册@WebServlet(urlPatterns="/my",name="my",loadOnStartup=1,i ...
- KnockoutJs学习笔记(九)
由于component binding部分的内容更为复杂一些,所以这部分我暂时跳过,先学习click binding部分. click binding不仅可以作用于button.input.a等元素, ...
- 如何安装pycharm
Ubuntu系统安装PyCharm教程(详细图文) 参考(http://jingyan.baidu.com/article/60ccbceb4e3b0e64cab19733.html)
- 如何快速的打开当前文件夹的dos命令窗口
一.常规方法: 1.使用 “window + R” 组合键,输入cmd回车.如下图所示: 2.如果你要定位到指定的文件夹,那么需要用cd等命令来处理.如下图所示: 二.快速方法: 按住“shift”键 ...
- 【noip模拟赛1】古韵之同心锁
据说在一座OI桥上,同心锁上显示的文字有着它奇异的呈现方式,需要你把它稍做改变才可解密.每个同心锁上都有3个数据.第一个数据是一个字符串s.第二个数据m表示把s串从m处分为两段,s[1]至s[m-1] ...
- IO知识点整理(四种基类的使用)
一:介绍 1.两种基类 字节流 InputStream,OutputStream 字符流 Reader,Writer 二:字符流的基本方法(文字的处理比较常见) 1.Writer的API 2.File ...
- sqlite读写
#coding=utf-8 import sqlite3 import os #创建数据库和游标 if os.path.exists(' test.db'): conn=sqlite3.connect ...