从LinqPad入门Linq

Posted Better l

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从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};

        }

以上是关于从LinqPad入门Linq的主要内容,如果未能解决你的问题,请参考以下文章

LINQ/LinqPad:相同的查询不同的结果

linqpad - 大 NOT IN 子句超出限制 - 还有其他方式吗? - Linq to SQL

使用 LINQPad 助力 LINQ 学习

ASP.NET EF 使用LinqPad 快速学习Linq

LINQ 查询添加 orderby 使 Skip 和 Take 不起作用 Linqpad

Linqpad - Linq to Sql Ambiguous表和链接服务器名称