• 从LinqPad入门Linq


    为什么要学习Linq?

    在我们日常开发中,经常需要从数据库中执行各式各样的查询来获取需要的数据。但是如果需要对查询获得的数据进行二次筛选呢?linq就提供了对于可枚举类型(实现IEnumerable接口)的一种便捷查询方式。正如其名Language Integrated Query语言集成查询。

    下载LinqPad

    LinqPad官方网站http://www.linqpad.net/,此篇示例使用的是LinqPad4。

    安装完成后界面如下:

    image

    点击左侧Add connection,添加数据库连接,本机是sqlserver 2008 R2,选择默认的LINQ to SQL,NEXT,选择你想要添加的数据库,点击OK即可添加成功。

    imageimage

    展开你连接的库树,表,存储过程,方法等都能够在视图中展示(如果数据库存在架构,表存放在其所属架构下)。

    image

    所有的表展开后都成为了”表名s”的格式,体现了Linq查询将表当做数据的集合的思想。

    image

     

    Linq的语法

    右键选中其中一个集合弹出菜单。

    分割线上:Take/Count/Where均是Qureyable方法(查询方法),以及两个查询模板。

    分割线下:查询或编辑数据。

    image

    这里我们选择第一个模板

    imageimage

    代码编辑窗口出现如下代码,这是一个比较直观的Linq语句模板

    from p in Persons
    where p. 
    select p

    Language→C# Program 并将其补充完整为我们在.Net开发中经常用到的C#代码块格式。

    image

    void Main()
      {
        var result = from p in Persons
                     where p.MiddleName == "A"
                     select p;
            result.Count().Dump();//输出结果个数
      }

    以此为基础,可以对Linq语句进行扩展

    1. 所有的linq查询都是以from开始,select或group结束。
    2. p是范围变量,Persons是数据集合。
    3. where关键字后是查询条件,可以同时存在多个where

    补充:有时编译器不能够识别自定义类型,可以显式指定范围变量的类型。如:from Person p in Persons。

    where p.MiddleName=="A"
    where p.Title=="Mr."
    //等同于
    where p.MiddleName=="A"&&where p.Title=="Mr."

    指得注意的是,var是推断类型,C#3.0新出的特性。编译器编译的过程中推断变量是什么类型,和所谓的强弱类型无关。(很多人说var是弱类型,这个是错误的)。

    比如,下图编译器推断dr为Object类型,无法通过索引器去访问,编译时报错。

    linq推断编译不通过

    更改为DataRow后编译通过

    推断类型编译通过

    PS: 既然是在编译过程中推断而不是运行时,所以就没有效率高低之分。但是为了代码的易读性和巩固基础,少用为好。

    排序orderby:

    var result=from p in Persons
        where p.MiddleName=="A"
        orderby p.EmailPromotion //默认升序,降序descending
        select p;

    分组group by:

    var result=from p in Persons
        where p.MiddleName=="A"
        group p by p.Title;

    select关键字:在查询中定义变量。

    into关键字:将查询结果放入一个变量,再次使用。

    var result=from p in Persons
        let midname=p.MiddleName
        where midname=="A"|| midname=="J"
        group p by p.Title
        into temp 
        where temp.Count()>1
        select temp;

    join关键字:内连接,左连接,右连接。此处用到了linq to sql

    void KeyWordJoin()
            {
    
               DataContext ctx = new DataContext();
    
                //内连接
                var innerJoin = from p in ctx.Person
                                where p.BusinessEntityID == 9
                                join c in ctx.Customer on p.BusinessEntityID equals c.CustomerID
                                select p;
    
                //左连接
                var leftJoin = from p in ctx.Person
                               join c in ctx.Customer on p.BusinessEntityID equals c.CustomerID
                               into joined  
                               from j in joined.DefaultIfEmpty() //join操作后,返回的集合为在后方的类型此处为Customer
                               select new { ID = p.BusinessEntityID, Number = j == null ? null : j.AccountNumber };
                //右连接同理
                var rightJoin = from c in ctx.Customer
                                join p in ctx.Person on c.CustomerID equals p.BusinessEntityID
                                into joined                       
                                from j in joined.DefaultIfEmpty()
                                select new { ID = c.CustomerID, Last = j == null ? null : j.LastName};
    
            }


    作者:SuperRaccoon
    出处:http://www.cnblogs.com/Geronimo/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
    推崇原创或用自己的语言加以总结。创造干货,收获干货。

     
  • 相关阅读:
    金蝶,用友,浪潮erp介绍
    Javascript(Prototype)继承机制的设计思想
    IEnumerator和IEnumerable的关系
    MVC实用构架实战(一)——使用MEF实现IOC
    sql 数字转换为字符串补0
    scrum角色及其职责介绍
    NPOI 名称空间介绍
    双循环排序与冒泡排序的区别
    Silverlight 应用 WCF RIA Services 在 IIS6 部署问题总结
    PD15 数据库反向工程
  • 原文地址:https://www.cnblogs.com/Geronimo/p/6323749.html
Copyright © 2020-2023  润新知