zoukankan      html  css  js  c++  java
  • [转]Linq语法一

     LINQ即语言集成查询,是.NET Framework 3.5中新增的功能。其功能类似于数据库中的SQL语句(实际上LINQ就是针对.NET Framework的SQL):提供标准的、易于学习的查询和更新数据模式。
    从from开始
    用过SQL的朋友都知道,最简单的SQL语句SELECT record FROM tableName:获取表中的所有记录,那么对应于LINQ,其语法如下:
    from record in tableName select record。
    明显的差异是将from语句放到了句首,此种语法方式只是为了适应Visual Studio中智能提示(试想如果将from子句放在后面,先输入select语句,此时select的对象类型尚不确定,智能提示无法做出相应提示)
    SQL语句是从数据库表中查询出记录,而LINQ适应的数据源更广,包括SQL Server数据库、XML文档、ADO.NET数据集以及所有支持IEnumerable及IEnumerable<T>接口的任意对象集合。
    LINQ只是一种语法
    LINQ查询语句实际上和我们常用的foreach语句相似:中间语言(IL)中并没有对应的foreach语句,编译器最终会将foreach语句转换为一些列的语句块,例如:

    1. string[] strs = new String[] {"One","Two","Three" };
      
    2. foreach (String s in strs)
      
    3. {
      
    4.     Console.WriteLine(s);
      
    5. }
      
    6. 
      

    转换为:

    隐藏行号 复制代码 ? C#
    1. string[] strs = new String[] {"One","Two","Three" };
      
    2. IEnumerator e = strs.GetEnumerator();
      
    3. while (e.MoveNext())
      
    4. {
      
    5.     Console.WriteLine(e.Current);
      
    6. }
      
    7. 
      

    在.NET Framework 3.5中为IEnumerable<T>接口加入了大量的扩展方法,这些方法为LINQ提供了实现基础(就像IEnumerable中GetEnumerator方法为foreach提供实现基础一样)
    例如,IEnumerable中的Where扩展方法,它和LINQ中的where子句对应,用于筛选数据:

    隐藏行号 复制代码 ? C#
    1. //使1用?Where方?法¨
      
    2.  IEnumerable<String> query = strs.Where(s => s.StartsWith("T"));
      
    3. foreach (String s in query)
      
    4. {
      
    5.     Console.WriteLine(s);
      
    6. }
      
    7. //使1用?query语?句?
      
    8. query = from s in strs
      
    9.         where s.StartsWith("T")
      
    10.         select s;
      
    11. foreach (String s in query)
      
    12. {
      
    13.     Console.WriteLine(s);
      
    14. }
      
    15. 
      


    题外话:如何为已知类型扩展方法:只需一个静态类和静态方法,在静态方法中参数使用this关键字,以下为String类型新增一个AppendA方法:

    隐藏行号 复制代码 ? C#
    1. public static class Extension
      
    2. {
      
    3.     public static String AppendA(this String ins)
      
    4.     {
      
    5.         return ins + "AAA";
      
    6.     }
      
    7. }
      
    8. 
      

    var关键字与匿名类型
    var关键字指示编译器推断出变量的类型,例如:
    var s = "Hello";
    编译器最终将s变量推断为String类型,即最终按
    String s = "Hello";
    来生成中间代码
    在LINQ中我们可以通过var关键字来声明查询对象,而无需清楚最终我们查询返回的具体类型:

    隐藏行号 复制代码 ? C#
    1. var query = from s in strs
      
    2.         where s.StartsWith("T")
      
    3.         select s;
      
    4. 
      


    另一种情况,有时我们只需要返回对象的某些属性,此时我们无需定义返回数据的类型,直接使用匿名类型:

    1:  var xxx = new { F1 = "Hello", F2 = "Hello2" };
    2:   

    以下查询只返回Programer类的Name和Position属性:

    隐藏行号 复制代码 ? C#
    1. public class Programer
      
    2.     {
      
    3.         public String Name { get; set; }
      
    4.         public String Language { get; set; }
      
    5.         public String Position { get; set; }
      
    6. 
      
    7.         public Programer()
      
    8.         {
      
    9.         }
      
    10.     }
      
    11. 
      
    隐藏行号 复制代码 ? C#
    1. Programer[] ps = new Programer[] { 
      
    2.     new Programer(){ Name="张?三y", Language="C#", Position="Leader"},
      
    3.     new Programer(){ Name="李?四?", Language="C#", Position="Coder"},
      
    4.     new Programer(){ Name="王?五?", Language="Java", Position="Coder"}
      
    5. };
      
    6. 
      
    7. var queryPs = from p in ps
      
    8.               where p.Language == "C#"
      
    9.               select new { Name = p.Name, Position = p.Position };
      
    10. 
      
    11.            
      
    12. foreach (var p in queryPs)
      
    13. {
      
    14.     Console.WriteLine(String.Format("Name:{0}		Position:{1}", p.Name, p.Position));
      
    15. }
      
    16. 
      

    查询的执行时间
    上述例子中LINQ语句是在foreach语句时才真正执行的,定义时只是定义了查询语句,在进入foreach枚举时才真正执行查询语句。如果我们在定义时需要立即返回查询结果可以使用ToArray或ToList方法(这两个方法也是在.Net Fromework 3.5中为IEnumerable接口新增的扩展方法)。

    隐藏行号 复制代码 ? C#
    1. var queryPs = (from p in ps
      
    2.               where p.Language == "C#"
      
    3.               select new { Name = p.Name, Position = p.Position }).ToArray();
      
    4. 
      
  • 相关阅读:
    [kuangbin带你飞]专题十二 基础DP1 E
    hdu 1203 I NEED A OFFER! (01背包)
    hdu 2602 Bone Collector (01背包)
    hdu 4513 吉哥系列故事——完美队形II (manacher)
    hdu 2203 亲和串 (KMP)
    hdu 1686 Oulipo (KMP)
    hdu 1251 统计难题 (字典树)
    hdu 2846 Repository (字典树)
    hdu 1711 Number Sequence (KMP)
    poj 3461 Oulipo(KMP)
  • 原文地址:https://www.cnblogs.com/xbblogs/p/4876907.html
Copyright © 2011-2022 走看看