第二十章 数据访问(In .net4.5) 之 使用LINQ
1. 概述
.net3.5中新添加给C#的LINQ查询,提供了直观便捷的数据查询方式。并且支持多种数据源的查询。
本章介绍标准的LINQ操作,如何用最优的方式使用LINQ 以及 LINQ to XML.
2. 主要内容
2.1 使LINQ可行的语言特性
① 隐式类型(Implicitly typed variables): 使用var标记,由编译器推断类型。也是强命名的。
② 对象初始化语法(Object initialization syntax):用一种简洁的语法进行对象初始化。
var people = new List<Person>
{
new Person
{
FirstName = “John”,
LastName = “Doe”
},
new Person
{
FirstName = “Jane”,
LastName = “Doe”
}
};
③ Lambda表达式:是匿名方法的简化形式。使用 => 符号。
Func<int, int> myDelegate =
delegate(int x)
{
return x * ;
};
Console.WriteLine(myDelegate()); // Displays 42 //用Lambda表达式改写
Func<int, int> myDelegate = x => x * ;
Console.WriteLine(myDelegate()); // Displays 42
④ 扩展方法
扩展方法可以在不继承某类型的情况下给其添加新的行为。扩展方法必须定义在静态类中,用this标记第一个参数。
public static class IntExtensions
{
public static int Multiply(this int x, int y)
{
return x * y;
}
} int x = ;
Console.WriteLine(x.Multiply()); // Displays 6
⑤ 匿名类:同时使用 对象初始化标记 和 隐式类型。
var person = new
{
FirstName = “John”,
LastName = “Doe”
}; Console.WriteLine(person.GetType().Name); // Displays “<>f__AnonymousType0`2”
2.2 使用LINQ查询
int[] data = { , , , , }; var result = from d in data
where d % ==
select d; foreach (int i in result)
{
Console.WriteLine(i);
}
// Displays 2 8
上述查询式语法可以被改写为方法式语法
var result = data.Where(d => d % == );
*where方法就是 IEnumerable<T>上的扩展方法。
① 标准LINQ操作包括: All, Any, Average, Cast, Count, Distinct, GroupBy, Join, Max, Min, OrderBy, OrderByDescending,
Select, SelectMany, Skip, SkipWhile, Sum, Take, TakeWhile, ThenBy, ThenByDescending, and Where.
int[] data = { , , , , };
var result = from d in data
where d >
orderby d descending
select d;
Console.WriteLine(string.Join(“, “, result)); // Displays 11, 8
* 可以将多个数据源的数据合并操作
int[] data1 = { , , };
int[] data2 = { , , }; var result = from d1 in data1
from d2 in data2
select d1 * d2; Console.WriteLine(string.Join(“, “, result)); // Displays 2, 4, 6, 4, 8, 12, 10, 20, 30
projection 和 grouping
var result = from o in orders
from l in o.OrderLines
group l by l.Product into p
select new
{
Product = p.Key,
Amount = p.Sum(x => x.Amount)
};
使用Skip和Take实现分页
var pagedOrders = orders
.Skip((pageIndex - ) * pageSize)
.Take(pageSize);
2.3 LINQ如何工作
实现自己的where方法
public static class LinqExtensions
{
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, bool> predicate)
{
foreach (TSource item in source)
{
if (predicate(item))
{
yield return item;
}
}
}
}
2.4 LINQ to Xml
① 查询
XDocument doc = XDocument.Parse(xml);
IEnumerable<string> personNames = from p in doc.Descendants(“Person”)
where p.Descendants(“PhoneNumber”).Any()
let name = (string)p.Attribute(“firstName”)
+ “ “ + (string)p.Attribute(“lastName”)
orderby name
select name;
② 创建
XElement root = new XElement(“Root”,
new List<XElement>
{
new XElement(“Child1”),
new XElement(“Child2”),
new XElement(“Child3”)
},
new XAttribute(“MyAttribute”, ));
root.Save(“test.xml”); //Outputs:
//<Root MyAttribute=”42”>
// <Child1 />
// <Child2 />
// <Child3 />
//</Root>
③ 修改
XElement root = XElement.Parse(xml); XElement newTree = new XElement(“People”,
from p in root.Descendants(“Person”)
let name = (string)p.Attribute(“firstName”) + (string)p.Attribute(“lastName”)
let contactDetails = p.Element(“ContactDetails”)
select new XElement(“Person”,
new XAttribute(“IsMale”, name.Contains(“John”)),
p.Attributes(),
new XElement(“ContactDetails”,
contactDetails.Element(“EmailAddress”),
contactDetails.Element(“PhoneNumber”)
?? new XElement(“PhoneNumber”, “”)
)));
3. 总结
① LINQ, 以一种统一的语法面向多种数据源编写查询语句。
② LINQ用到的一些语言特性包括:implicit typing, object initialization syntax, lambdas, extension methods, and anonymous types。
③ 可以使用查询式语法或者方法式语法来编写LINQ查询。
④ LINQ是延迟执行模式,声明的时候是不会实际执行查询的,第一次遍历开始时才会执行。调用ToList或者Count方法时会立即执行。
⑤ 可以使用LINQ to Xml 来查询、创建 和 修改 xml 数据。
第二十章 数据访问(In .net4.5) 之 使用LINQ的更多相关文章
- 第二十二章 数据访问(In .net4.5) 之 集合
1. 概述 本章内容包括 .net平台中的集合.如何选择集合 以及 如何实现自定义集合. 2. 主要内容 2.1 使用数组(Array) ]; ; x < arrayOfInt.Length; ...
- 第二十一章 数据访问(In .net4.5) 之 序列化
1. 概述 应用程序间传递数据,需要先将数据对象转化为字符流或字节流的形式,然后接收端收到后再转化回原始的数据对象.这就是序列化与反序列化. 本章介绍 .net中的序列化与反序列化.序列化器的种类 以 ...
- 第十八章 数据访问(In .net4.5) 之 I/O操作
1. 概述 本章内容包括 文件操作.流操作.读写网络数据 以及 异步I/O操作. 2. 主要内容 2.1 文件操作 ① 使用 Drive 和 DriveInfo 访问磁盘信息. DriveInfo[] ...
- 第十九章 数据访问(In .net4.5) 之 处理数据
1. 概述 本章介绍 数据库.Json和Xml.web services 三种介质上的数据操作. 2. 主要内容 2.1 数据库 ① 建立连接 .net平台中的数据连接类都继承自DbConnectio ...
- 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布
在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.n ...
- 数据访问层的改进以及测试DOM的发布
数据访问层的改进以及测试DOM的发布 在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层 ...
- JavaScript 数据访问(通译自High Performance Javascript 第二章) [转]
JavaScript 数据访问(通译自High Performance Javascript 第二章) JavaScript 数据访问(翻译自High Performance Javascript ...
- Oracle数据访问组件ODAC的安装方法
Oracle数据访问组件ODAC(Oracle Data Access Components)顾名思义就是用来访问Oracle数据库的小程序.我们可以编程调用这些组件来实现在没有安装Oracle数据库 ...
- Oracle数据访问组件ODAC的安装方法:
Oracle数据访问组件ODAC(Oracle Data Access Components)顾名思义就是用来访问Oracle数据库的小程序.我们可以编程调用这些组件来实现在没有安装Oracle数据库 ...
随机推荐
- EF连接mysql数据库生成实体模型
声明:本人也是第一次用EF连接mysql生成实体模型 经过试验: mysql-connector-net-6.6.6 可以支持VS2012 mysql-connector-net-6.3.9 可以支持 ...
- Redis集群搭建&访问
集群搭建步骤 1.创建多个节点: 2.为每个节点指派槽,并将多个节点连接起来,组成一个集群: 3.当集群数据库的16384个槽都有节点在处理时,集群进入上线状态: 要求:搭建一个包含6个节点的Redi ...
- android NDk环境编译总结
首先,这篇文章的撰写是基于很多前人的优秀的帖子,感谢他们的分享让我能够学习这么多的知识.谢谢 Android NDK开发环境的搭建 前言: Android 上,应用程序的开发,大部分基于 Java 语 ...
- Postman使用小技巧 - 用Postman生成Request代码
Postman这款工具可以让你很方便的测试你的Web API,那如果你实在是没办法用Postman,必须手写代码,又或者你有别的需求是Postman没法实现的,你必须写一个特殊的script或App来 ...
- 用github pages展示你的静态网页,多项目支持
我看到有分享用github pages来做博客的,不过我并不想挂博客在上面,我只是想将我的一些作品挂上去,然后链接到我的简历里,这样HR可以直接看到. 首先是最基本的操作,在github上创建一个新的 ...
- VS2013 当前不会命中断点还未为文档加载任何符号
情况:在别人那边的项目可以调试,在我这边不行.看来是电脑环境问题了 自己试过 VS2013修复下(用了1个半小时),点评:无效 网上 五花八门的都不适合 1.设置与当前版本不一致取消打勾. 点评 ...
- 【drp 1】使用易宝实现在线支付
导读:在很多网站上,都会涉及到在线支付的功能,总所周知的有:淘宝.天猫.京东等等.我们常见的支付方式有支付宝.微信钱包.银行卡支付等.本篇博客,将介绍一种使用易宝第三方软件进行在线支付的功能. 一.基 ...
- docker学习(二)
1 镜像 docker使用联合加载技术,一次同时加载多个文件系统,在外面只能看到一个文件系统 docker使用写时复制,每个只读镜像层都是只读的,也永远不会发生变化,建立一个新容器,会构建一个镜像栈, ...
- python os模块sys模块常用方法
官方文档看这里 https://docs.python.org/3.5/library/os.html http://www.cnblogs.com/wupeiqi/articles/5501365. ...
- 【转】怎样提高VR渲染速度
怎样提高VR渲染速度分析!<经验之谈>!!!VR的基本渲染方法掌握起来并不难,但是最迫切需要解决的问题是VR的出图速度问题.动则需要数小时的渲染时间真的是很难以接受,我们从三个影响速度的参 ...