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的更多相关文章

  1. 第二十二章 数据访问(In .net4.5) 之 集合

    1. 概述 本章内容包括 .net平台中的集合.如何选择集合 以及 如何实现自定义集合. 2. 主要内容 2.1 使用数组(Array) ]; ; x < arrayOfInt.Length;  ...

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

    1. 概述 应用程序间传递数据,需要先将数据对象转化为字符流或字节流的形式,然后接收端收到后再转化回原始的数据对象.这就是序列化与反序列化. 本章介绍 .net中的序列化与反序列化.序列化器的种类 以 ...

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

    1. 概述 本章内容包括 文件操作.流操作.读写网络数据 以及 异步I/O操作. 2. 主要内容 2.1 文件操作 ① 使用 Drive 和 DriveInfo 访问磁盘信息. DriveInfo[] ...

  4. 第十九章 数据访问(In .net4.5) 之 处理数据

    1. 概述 本章介绍 数据库.Json和Xml.web services 三种介质上的数据操作. 2. 主要内容 2.1 数据库 ① 建立连接 .net平台中的数据连接类都继承自DbConnectio ...

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

    在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.n ...

  6. 数据访问层的改进以及测试DOM的发布

    数据访问层的改进以及测试DOM的发布 在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层 ...

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

    JavaScript 数据访问(通译自High Performance Javascript 第二章)   JavaScript 数据访问(翻译自High Performance Javascript ...

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

    Oracle数据访问组件ODAC(Oracle Data Access Components)顾名思义就是用来访问Oracle数据库的小程序.我们可以编程调用这些组件来实现在没有安装Oracle数据库 ...

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

    Oracle数据访问组件ODAC(Oracle Data Access Components)顾名思义就是用来访问Oracle数据库的小程序.我们可以编程调用这些组件来实现在没有安装Oracle数据库 ...

随机推荐

  1. Grid Infrastructure Single Client Access Name (SCAN) Explained (文档 ID 887522.1)

    APPLIES TO: Oracle Database - Enterprise Edition - Version 11.2.0.1 and laterExalogic Elastic Cloud ...

  2. 推荐一个PHP在线代码运行的网站

    地址:http://www.manongjc.com/runcode 该网站可以运行php代码.html代码.js代码, 对于初学者来说,免去了安装环境这一步.

  3. UIApplication及UIWindow

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  4. [转]用man查看命令帮助时, 括号中的数字表示的意思

    当提及如'rn(1)', 'ctime(3)'时,它们看上去像某种函数调用,但不是. 这些数字表示可在"Unix manual"中的哪一部分找到对应的文档. 数字对应的文档如下: ...

  5. Ant 脚本打印系统属性变量、ant内置属性

    Ant 脚本打印系统属性变量.ant内置属性 作用 编写ant脚本的时候,经常会引用到系统属性,本脚本用于打印系统常用属性(System.getProperties)与环境变量(Environment ...

  6. Jsp:useBean标签的使用

    1.<jsp:useBean id="为Bean起的别名(随意起)" class="Bean的目录,从包名开始写" scope="page | ...

  7. memcached学习(二)

    Slab Allocation机制:整理内存以便重复使用 最近的memcached默认情况下采用了名为Slab Allocator的机制分配.管理内存. 在该机制出现以前,内存的分配是通过对所有记录简 ...

  8. url 参数的加号变成空格处理

    今天在调试客户端向服务器传递参数时,参数中的“+”全部变成了空格,原因是URL中默认的将“+”号转义了. 解决方法如下: 方法一.修改客户端 将客户端带“+”的参数中的“+”全部替换为‍“2B%”,这 ...

  9. mysql数据导入

    1.windows解压 2.修改文件名,例如a.txt 3.rz 导入到 linux \data\pcode sudo su -cd /data/pcode/rm -rf *.txt 4.合并到一个文 ...

  10. Chrome 和 Webkit 的渊源

    互联网的浪潮从未停息,而用以网上冲浪的冲浪板也一直在变得愈加精良.自人们进入互联网时代以来,即已经发生了三次浏览器大战.第一次浏览器大战的主角是IE和Netscape,最终IE凭借着Windows的庞 ...