第二十章 数据访问(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 * 2;
    };
Console.WriteLine(myDelegate(21)); // Displays 42

//用Lambda表达式改写
Func<int, int> myDelegate = x => x * 2;
Console.WriteLine(myDelegate(21)); // Displays 42

    ④ 扩展方法

      扩展方法可以在不继承某类型的情况下给其添加新的行为。扩展方法必须定义在静态类中,用this标记第一个参数。

public static class IntExtensions
{
    public static int Multiply(this int x, int y)
    {
        return x * y;
    }
} 

int x = 2;
Console.WriteLine(x.Multiply(3)); // Displays 6

    ⑤ 匿名类:同时使用 对象初始化标记 和 隐式类型。

var person = new
{
    FirstName = “John”,
    LastName = “Doe”
}; 

Console.WriteLine(person.GetType().Name); // Displays “<>f__AnonymousType0`2”

  2.2 使用LINQ查询

int[] data = { 1, 2, 5, 8, 11 }; 

var result = from d in data
             where d % 2 == 0
             select d; 

foreach (int i in result)
{
    Console.WriteLine(i);
}
// Displays 2 8  

    上述查询式语法可以被改写为方法式语法

var result = data.Where(d => d % 2 == 0);

    *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 = { 1, 2, 5, 8, 11 };
var result = from d in data
             where d > 5
             orderby d descending
             select d;
Console.WriteLine(string.Join(“, “, result)); // Displays 11, 8

    * 可以将多个数据源的数据合并操作

int[] data1 = { 1, 2, 5 };
int[] data2 = { 2, 4, 6}; 

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 - 1) * 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”, 42));
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”, “112233455”)
        )));

3. 总结

  ① LINQ, 以一种统一的语法面向多种数据源编写查询语句。

  ② LINQ用到的一些语言特性包括:implicit typing, object initialization syntax, lambdas, extension methods, and anonymous types。

  ③ 可以使用查询式语法或者方法式语法来编写LINQ查询。

  ④ LINQ是延迟执行模式,声明的时候是不会实际执行查询的,第一次遍历开始时才会执行。调用ToList或者Count方法时会立即执行。

  ⑤ 可以使用LINQ to Xml 来查询、创建 和 修改 xml 数据。

时间: 2024-08-28 11:41:40

第二十章 数据访问(In .net4.5) 之 使用LINQ的相关文章

高性能javascript(第二章 数据访问)

1.数据存储位置关系到访问速度.在 JavaScript 中有四种基本的数据访问位置: 直接量: 变量: 数组: 对象: 2.多数情况下,对一个直接量和一个局部变量数据访问的性能差异是微不足道的. 3.作用域和标示符解析: 每一个 JavaScript 函数都被表示为对象.进一步说,它是一个函数实例.函数对象正如其他对象那样, 拥有你可以编程访问的属性,和一系列不能被程序访问,仅供 JavaScript 引擎使用的内部属性. 其中一个内部属性是[[Scope]],由ECMA-262 标准第三版定

第二十一章 数据访问(In .net4.5) 之 序列化

1. 概述 应用程序间传递数据,需要先将数据对象转化为字符流或字节流的形式,然后接收端收到后再转化回原始的数据对象.这就是序列化与反序列化. 本章介绍 .net中的序列化与反序列化.序列化器的种类 以及 为序列化配置对象. 2. 主要内容 2.1 序列化与反序列化 序列化只能保存对象的数据部分,不能保存方法部分.可以创建custom data transfer object(DTO)来只保存指定的数据信息. .net平台提供三种类型的序列化: ① XmlSerializer: [Serializ

第十八章 数据访问(In .net4.5) 之 I/O操作

1. 概述 本章内容包括 文件操作.流操作.读写网络数据 以及 异步I/O操作. 2. 主要内容 2.1 文件操作 ① 使用 Drive 和 DriveInfo 访问磁盘信息. DriveInfo[] drivesInfo = DriveInfo.GetDrives(); foreach (DriveInfo driveInfo in drivesInfo) {     Console.WriteLine(“Drive {0}”, driveInfo.Name);     Console.Wri

二.数据访问

第二章  数据访问 读书笔记: JavaScript 中有四种基本数据访问位置: 直接量:直接量仅仅代表自己,而不存储特定位置.字符串,数字,布尔,对象,数组,函数,正则表达式,具有特殊意义的空值,以及未定义. 变量:var关键字创建用于存储数据值. 数组项:具有数字索引,存储一个javascript数组对象. 对象成员: 具有字符串索引,存储一个javascript对象. 总的来说, 直接量和局部变量的访问速度要快于数组项和对象成员的访问速度. 管理作用域 每个javascript函数都被表示

企业级应用框架(三)三层架构之数据访问层的改进以及测试DOM的发布

在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.net,EF,linq To Sql,这一点我们实现的不是很完美,仍有很大的改进空间,本文将加以改进. 在此之前我们来看一下我们最新的dom(PS:经过两天的赶工,我们的dom已经相对成熟,其中BLL层已经被我高度抽象化了,并且引进了业务上文文的概念:DAL层除了具体的技术实现尚为完成,其他方面已经相

JavaScript 数据访问(通译自High Performance Javascript 第二章) [转]

JavaScript 数据访问(通译自High Performance Javascript 第二章) 提问者:lilei335260(ID:160310) | 悬赏 0.0 希赛币 | 回答数:12 | 关注度:32 | 提问时间:2014-05-03 JavaScript 数据访问(翻译自High Performance Javascript 第二章) 计算机科学中一个经典的问题是决定如何存储数据,以便进行快速的读取和写入操作. 在代码执行期间,数据如何存储将会关系到它们的检索速度.在Jav

Oracle数据访问组件ODAC的安装方法

Oracle数据访问组件ODAC(Oracle Data Access Components)顾名思义就是用来访问Oracle数据库的小程序.我们可以编程调用这些组件来实现在没有安装Oracle数据库软件的电脑上完成对Oracle数据库的访问. 工具/原料 ODAC安装包 步骤1. 下载ODAC安装包 到Oracle官方网站下载ODAC安装包.在网页上找到你要的版本.我下载的是: 64-bit ODAC 11.2 Release 6 (11.2.0.4.0) Xcopy for Windows

十步优化SQL Server中的数据访问(转载)

原文地址:http://tech.it168.com/a2009/1125/814/000000814758.shtml 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调查访问变慢的原因. 经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表

微软-创建数据访问层

简介 https://msdn.microsoft.com/zh-cn/cc964016 作为web 开发人员,我们的工作总是在和数据打交道.我们创建数据库来存储数据,编写代码来检索并修改数据,并创建Web 页面来收集和汇总数据.这是探讨在ASP.NET 2.0 中实现这些常用类型的技巧的系列教程中的首篇教程.我们从创建一个 软件架构 开始,包括使用Typed DataSet 的数据访问层(DAL) .实现自定义业务规则的业务逻辑层(BLL) 和共享同一页面布局的ASP.NET 页面组成的表示层