lovebet体育官网(LINQ 学习系列)(3)学习Linq的几只基础知识。LINQ的意图。

含有类型有变量

作软件开发人员,我们挺酷一部分时空还花费在了取得和操作数据方面。而说及数码,我们见面自然而然地想到包含在关系数据库里之信息、使用的XML文档、保存在本地的DataSet、内存中之List列表等等。通常我们见面针对数码进行过滤与稳定,查询有符合要求的那部分数额。

var age = 26;

var username = "meetweb";

var userlist = new [] {"a","b","c"};

foreach(var user in userlist)

Console.WriteLine(user);

 

以.NET
3.5前的本被,与一定的数据类型打交道时,我们如果使用一定特定命名空间下之一定项目。如下表列出了操作各种大类型的API

     
纯粹让懒人用之var关键字,告诉编译器(对于CLR来说,它是无见面知晓你是否用了var,苦力是编译器出之),你自己想其的项目吧,我不管了。但是既然被编译器推断类型就必须声明的当儿赋值,而且未可知是null值。注意,这不得不用来局部变量,用于字段是未可以的。

目标数据

操作数据的.NET类型

关系数据

System.Data.dll和System.Data.SqlClient.dll

XML文档数据

System.Xml.dll

元数据

System.Reflection命名空间

内存对象集合

System.Array和   System.Collection/System.Collection.Generic命名空间

匿名类型

则这些操作数据的方本身没有问题,比如我们且见面一直动用ADO.NET、XML命名空间、反射服务以及各种集合类型。但是精神之题目在于,这些API的诸一样栽自我就是同等幢孤岛,提供了酷少的融会方式。比如我们可将ADO.NET
DataSet保存也XML,然后通过System.Xml命名空间来操作。但是各API之间无替代品,我们无奈用ADO.NET
API来操作XML,也非能够用System.Array来操作关系数据。

var data = new {username = "meetweb",age = 26};

Console.WriteLine("username:{0} age:{1}", data.username, data.age);

 

LINQ(语言级集成查询)的来意就是提供相同种植统一且对如之方,让程序员在广义的多寡及得与操作数据。通过动用LINQ,我们能当C#编程语言内直创造给喻为“查询表达式(query
expression)”的实业。这些查询表达式是依据许多查询运算符(query
operator)的,而且是明知故犯设计改为类似SQL表达式的。并且,查询表达式可以据此来与余数开展互,以同样栽统一的章程来操作各种数据。

匿名类型允许开发人员定义行内类型,无须显式定义类型。常与var配合下,var用于声明匿名类型。定义一个临时之匿名类型在LINQ查询句法中好大,我们可好有益于之落实目标的变和影子。

严格来说,LINQ是用来叙述数据看总体方式的术语。LINQ to
Object是针对性落实了IEnumerable<T>的靶子的LINQ;LINQ to
SQL是指向关系数据库的LINQ;LINQ to XML是针对XML文档的LINQ。

 

LINQ除了提供一个合之API来操作各种数据,并且为我们提供了编译时类型检查以及动态创建查询表达式的力。

 

 

Lambda表达式

从这里开始

“Lambda
表达式”是一个匿名函数,它可以蕴涵表达式和讲话,并且只是用来创造委托或表达式树类型。

LINQ中最基本的数单元是sequences和elements。一个sequence是落实了IEnumerable<T>的目标,而一个element是sequence中的诸一个素。如下,names就是一个sequence,”Tom”,“Dick”和”Harry”则是elements。

抱有 Lambda
表达式都采取 Lambda
运算符
=>,该运算符读为“goes
to”。 该 Lambda
运算符的左侧是输入参数(如果来),右边包含表达式或语句块。Lambda
表达式 x => x * x 读作“x goes
to x times x”。

    string[] names = { “Tom”, “Dick”, “Harry” };

=>
运算符具有和赋值运算符 ( =)
相同的优先级,并且是右手结合运算符。

一个查询运算符就是用来转换sequence的措施。一个榜首的询问运算符接收一个输入sequence并出口一个转移后的sequence。在System.Linq.Enumerable类中,总共定义了40来个查询运算符—-全部于是扩展方法来实现,他们给称为标准查询运算符。

语法如下:

一个询问则是出于询问运算符来转换sequence的一个表达式,最简便易行的查询由一个input
sequence和一个查询运算符组成。比如:

     
(参数列表) =>
表达式或者语句块

    string[] names = { “Tom”, “Dick”, “Harry”   };

其中:

    // 获取具有长度超过等于4之讳
    IEnumerable<string> filteredNames =
System.Linq.Enumerable.Where(
        names, n => n.Length >= 4);

参数个数:可以生出差不多独参数,一个参数,或者无参数。

    foreach (string n in filteredNames)
        Console.WriteLine(n);

表达式或者语句块:这有些纵是咱们平常写函数的兑现有(函数体)。

输出:
Dick
Harry

 

因为查询运算符是以扩展方法实现的,所以我们可一直在names对象上调用Where:

Lambda
在冲方法的 LINQ
查询中之所以作专业查询运算符方法(如
Where)的参数。

     // 获取具有长度逾等于4底讳
     IEnumerable<string> filteredNames = names.Where(n =>
n.Length >= 4);

行使基于方法的语法在
Enumerable 类中调用 Where
方法时(像在 LINQ to
Objects 和 LINQ to
XML 中那样),参数是委托项目 System
. Func
< T,
TResult >。 使用 Lambda
表达式创建委托最为有利。例如,当您在
System.Linq .
Queryable 类中调用相同的计时(像以 LINQ to
SQL 中那么),则参数类型是
System.Linq.Expressions .
Expression <Func>,其中 Func
是含有至多五只输入参数的别样 Func
委托。 同样,Lambda
表达式只是同等种植用于组织表达式树的万分简短的法子。尽管事实上通过 Lambda
创建的靶子的类是见仁见智的,但 Lambda
使得 Where 调用看起好像。

咱得以经过利用var关键字来一发简写我们的query:

 

     var filteredNames = names.Where(n => n.Length >= 4);

托实例化为
Func<int,bool>
myFunc,其中
int
是输入参数,
bool
是归值。
始终在最后一个型参数中指定返回值。Func<int,
string, bool>
定义包含两只输入参数(
int

string)且返回路也
bool
的委托

流动:在初学LINQ时,var关键字也许会见影响可读性,特别是在没有IDE和智能提醒的时光,因而要可能,我会在遵照系列的开端尽心尽力利用合适的回来路。

 

大部询问运算符都接受一个lambda表达式作为参数,lambda表达式决定了询问的所作所为特征以及结果。在上例中,lambda表达式为:

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

    int oddNumbers = numbers.Count(n => n % 2 == 1);

          n => n.Length   >= 4  

编译器可以推测输入参数的种,或者你为堪显式指定该档。这个专门之 Lambda
表达式将计整数 (
n)
的数额,这些整数除为 2
时余数为
1。

Lambda表达式格式为:(parameters) => expression-or-statement-block

 

每当这里的lambda表达式中,输入参数n对诺了names数组的诸一个因素,其项目也string。Where运算符要求lambda表达式返回一个bool值,当结果为true时,表示该因素会蕴藏在输出sequence中。这里是Where运算符的法子签名:

var firstNumbersLessThan6 = numbers.TakeWhile(n => n < 6);

     public static IEnumerable<TSource> Where<TSource>
            (this IEnumerable<TSource> source, Func<TSource,
bool> predicate)

别一个行列,其中包含数字数组中以“9”左边的有因素,因为“9”是班中无满足条件的首先独数字

下面的query获取具有包含字母a的讳:

  

     string[] names = { “Tom”, “Dick”, “Harry” };
     IEnumerable<string> filteredNames = names.Where(n =>
n.Contains(“a”));

var firstSmallNumbers = numbers.TakeWhile((n, index) => n >= index);

     foreach (string name in filteredNames)
           Console.WriteLine(name);    // Harry

通过以输入参数括在括号中来指定多个输入参数。该法以回数字数组中之持有因素,直至遇到一个值仅次于其岗位的数字了。不要将 Lambda
运算符 (
=>) 与过量等于运算符 (
>=) 混淆

及现完结,我们经过以扩展方法与lambda表达式来起了LINQ
query。我们飞速便可知望,这种方针十分之利落和符合query的创办,因为咱们可以级联的运查询运算符。通常,这种办法让叫作LINQ方法语法(英文作文中称之为fluent
systax)。C#尚提供了另外一种植书写query的语法,叫做查询表达式语法(英文作文中叫query
expression
systax),下面是一个因此查询表达式语法建立之query,让咱先行看见为抢:

 

      IEnumerable<string> filteredNames = from n in names
                                          where n.Contains(“a”)
                                          select n;    // Harry

Object/Relation
Mapping

方法语法和询问表达式语法是互为补充的,在事后的LINQ方法语法和查询语法一篇中,我们会详解他们的关联与区分。

对象

  -关系数据库映射

  规则表达式

  ORM把应用程序世界表示也富有角色(关系蒙之一些)的相同组对象(实体或值)。ORM有时也称之为基于实际的建模,因为它把有关数据描述为核心事实。这些真相而分为还略之实际就见面掉信息。

  简单事实的片段例包括:

  人有电话

  人住在有地方

  人生被有日期

 

  人在某日期为雇佣

  ORM提供的非只是是描述不同对象中事关之一个简易而直接的主意。ORM还提供了灵活性。使用
ORM创建的模子比用其它方法创建的型更发出力量适应系统的变动。另外,ORM允许请勿技术公司专家按照样本数讨论模型,因此他们可以下真实世界的数据说明模型。因为ORM允许用对象,数据模型能自动映射到对原则的数据库结构。

  ORM模型的简单性简化了数据库查询过程。使用ORM查询工具,用户可看期望数据,而不用理解数据库的最底层结构。

 

概念

  对象-关系映射(Object/Relation
Mapping,简称ORM),是乘面向对象的软件开发方法提高使发出的。面向对象的开发方法是现行铺面级以开发条件面临的主流开发方法,关系数据库是公司级应用环境中永久存放数量的主流数据存储系统。对象和关系数据是工作实体的少种表现形式,业务实体在内存中表现吧对象,在数据库中展现为关系数据。内存中的目标中有关联和继续关系,而以数据库中,关系数据无法直接表达多针对大多关系和延续关系。因此,对象-关系映射(ORM)系统一般坐中间件的款型是,主要实现程序对象到关系数据库数据的照耀。

  面向对象是自软件工程基本条件(如耦合、聚合、封装)的功底及前进兴起的,而关系数据库则是起数学理论发展使来之,两效理论在明显的区分。为了化解这不匹配的观,对象关联映射技术出现。

  让我们打O/R开始。字母O起源于”对象”(Object),而R则来自于”关系”
(Relational)。几乎有的次第中,都是对象及关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们要将目标的音讯保存在关系数据库中。

  当您开一个应用程序的时光(不使O/R
Mapping),你或许会见刻画过多数额访问层的代码,用来打数据库保存,删除,读取对象信息,等等。你于DAL中写了好多之计来读取对象数据,改变状态对象等等任务。而这些代码写起来总是还的。

  如果打开你最近底次序,看看DAL代码,你势必会视成千上万接近之通用的模式。我们盖保存对象的法门吗条例,你传入一个对象,为SqlCommand对象上加SqlParameter,把持有属性和目标对应,设置SqlCommand的
CommandText属性为存储过程,然后运行SqlCommand。对于每个对象都要重复的抒写这些代码。

  除此之外,还有复好之方式也?有,引入一个O/R Mapping。实质上,一个O/R
Mapping会为您生成DAL。与那和好写DAL代码,不如用O/R Mapping。你用O/R
Mapping保存,删除,读取对象,O/R
Mapping荷生成SQL,你只有需要关注对象就好。

  对象关系映射成功用在不同的面向对象持久层产品遭,如:Torque,OJB,Hibernate,TopLink,Castor
JDO, TJDO 等。

  一般的ORM包括以下四有些:

  一个对持久类对象进行CRUD操作的API;

  一个语言或API用来规定与类似与类属性相关的查询;

  一个规定mapping metadata的家伙;

  一种植技术好吃ORM的兑现同事务对象同展开dirty checking, lazy
association fetching以及其他的优化操作。

 

  
所有的linq对象,都持续给IEnumerible、和IQuerible这点儿独集聚接口,所以于收获集合时,可以转换这片栽格式   
IQuerible继承自IEnumerible

相关文章