LINQ学习入门教程(一)

LINQ 查询简介

      Linq 是一跨各种数据源和数据格式的数据模型;它在查询是,始终是把它作为一种对象来操作,可以使用基本相同的编码模型查询和数据的转换XML,SQL,ADO数据等;

Linq查询的三个步骤

            在我们使用Linq来查询数据的时候我们都会按照这三个步骤来做,这是初学者应该记住
            1.创建数据源,这里的数据源可以是数组,集合,XML,SQL等数据库
            2.新建一个查询,
                如: from xxxx in xxxxx where xxx select;这一种结构,注意的是,必须以from开头,select结尾
            3.执行查询。在这里我们通常用到执行查询就是foreach来做,当然有for语句也可以,但后者在效率上没有前者好;

下面我们就用这个三个步骤来做一个示例:
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Collections;
 6 
 7 namespace LINQDemo
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             int[] number = new int[7] { 1324567 };  //create Datasourse
14             var n = from num in number where (num % 2 == 0) select num; // create Query
15             foreach (int a in n)   //Query execution
16             {
17                 Console.WriteLine(a.ToString());
18             }
19         }
20     }
21 }
执行的结果:2,4,6
首先建了一个int的数组作为数据源,其次创建了一个查询,最后执行了这个查询
现在来看看是怎么来执行这个过程的,如图所示:


       每执行查询时,同要去查询的条件中找,符合条件的数据,大家下来可以一步步的调试,就要可以清楚的看到他的执行步骤了。

        在上面一个示例是我们的数据源用的是一个int 的数组,刚来我们也说过数据源可以是XML ,数据库等
我们来看看XML:
using System.xml.Linq;
XElement element = XElement.Load(@"cao.xml");

用数据库作为数据源:
using System.Data.Linq;
DataContext dt = new DataContext(@"cao.mdf");

在以后的文章中我会讲到这两种数据源,这里就不做示例了;

接下来我们来看一个对ArrayList的一个查询示例:
新建一个Student类:
Code
接下来把这个实体添加到集合中,并查询:
 1 ArrayList arr = new ArrayList();
 2             arr.Add(
 3                 new Student
 4             {
 5                 Name = "caodaiming",
 6                 Address = "sichuan",
 7                 Score = 49
 8             });
 9 
10             arr.Add(
11                 new Student
12                 {
13                     Name = "lishi",
14                     Address = "xi'an",
15                     Score = 44
16                 }
17                 );
18 
19             var querry = from Student student in arr select student;
20 
21             foreach (Student st in querry)
22 
23                 Console.WriteLine(st.Name + "-----" + st.Address + "-------" + st.Score);
        在这里我们还是按照了查询的基本步骤来做的,没有什么变化,只要记住这个步骤就OK了。

        现在说说查询的表达试吧,其实这与我们数据库的语句有一点像,数据库的语句是select .....from .....,而Linq查询语句是from ..... in ..... where ......select 完全一我们SQL语句是相反的,Linq查询语句是面对象的查询语句,就是JAVA中Hibernate 中的HQL一样,都是一种面像对象的语句,如果有兴趣的朋友可以去对比一下这两者的不能之处;

        好了就写到这里吧,以上的文章由自己的理解写出,但还是有很多的不足的地方,希望大家对我提出你们的看法,这是也是我边学边写的,在这里我借用了MSDN的文章来完成这遍文章的写作;

posted @ 2008-05-07 21:31 good man 阅读(1953) 评论(13)  编辑 收藏 所属分类: LINQ学习入门教程

  回复  引用    
#1楼 2008-05-07 22:02 | 情感天空 [未注册用户]
通俗易懂不错
  回复  引用  查看    
#2楼 2008-05-08 01:16 | Anytao      
在这里我们通常用到执行查询就是foreach来做,当然有for语句也可以,但后者在效率上没有前者好
------------------------------------------------------
不敢苟同,从何说起?:-)

实际上,大部分情况下for的执行效率反而优于foreach,这种差别尤其是在.NET 2.0之前,以后在编辑器方面对foreach进行了很多优化,执行效率才变得不那么突出。

我想推荐foreach的原因,排除了性能上的差别,更多考虑的应该是以下几点:

1 foreach的简洁性,代码很漂亮;
2 foreach能够迭代多维数组
3 foreach能够自适应不同的类型转换
。。。

一家之言:-)

  回复  引用  查看    
#3楼 2008-05-08 09:26 | SZW      
@Anytao
for是foreach的“本源”,所以在很多情况下它们的效率几乎是相同的,但是有一种情况(或者说是一系列常用的情况),for会明显比foreach低效,我举个例子:
List<Student> st=new List<Student>();
这时候用for和foreach可以分别这么写:
for(i=0;i<st.Count();i++){...}
foreach(Student s in st){...}
看上去是一样的,但是差别很大,在这样的for循环中,每次都会自动判断i是否超界st.Count();这个测试会判断是否需要抛出一个IndexOutOfRangeExcetion异常,这额外增加了CLR运行的负担。
当然我们可以这样改进:
int length=st.Count();for(i=0;i<length;i++){...}
但是就像你说的,仍然不“漂亮”,不方便,而且取值的时候麻烦。
  回复  引用  查看    
#4楼 2008-05-08 09:36 | 风中的猪儿      
@SZW
for(i=0;i<st.Count();i++){...}
这里st.Count()是个方法,你不能硬把这个方法所消耗的性能算到for语句的本身里面吧……
如果只是单比for和foreach的差别的话,当然要用你说的改进方法来比啦

不过你的例子很有警示作用呢,如果盲目以为for比foreach快的话而写出上for(i=0;i<st.Count();i++){...} 这种代码,也是适得其反.
  回复  引用  查看    
#5楼 2008-05-08 09:38 | SZW      
@风中的猪儿
你说的对,这里放Count()有点特殊了,我是想沿用楼主的例子(楼主产生的应该是IEnumerable类型,也需要用Count())。但是不管是Count()还是.length,在我举的例子里面,这些差别同样都是存在的。你也可以使用任何使用.length方法的类型,是否需要抛出IndexOutOfRangeExcetion异常还是会被判断。
  回复  引用  查看    
#6楼 2008-05-08 09:46 | 笑清风      
楼主啊 能否注意下版面的排版和文章的层次性还有错别字 这样的话更易读。^_^
  回复  引用  查看    
#7楼 2008-05-08 09:51 | Da Vinci      
同意 Anytao
for还是比foreach要快一些的


  回复  引用  查看    
#8楼 2008-05-08 09:53 | SZW      
@Da Vinci
经过JIT编译以后,foreach在CLR就是以for形式存在的,这个“快”从何体现呢?
  回复  引用  查看    
#9楼 2008-05-08 09:53 | Da Vinci      
LZ以后再写文章时请写明参考文献 :-)
好熟悉的东西阿呵呵

  回复  引用  查看    
#10楼 2008-05-08 10:53 | 镜涛      
我想推荐foreach的原因,排除了性能上的差别,更多考虑的应该是以下几点:

1 foreach的简洁性,代码很漂亮;
2 foreach能够迭代多维数组
3 foreach能够自适应不同的类型转换
  回复  引用  查看    
#11楼 2008-05-09 17:32 | 王孟军!      
很就没来了,支持
  回复  引用  查看    
#12楼 2008-05-30 12:10 | Yes!加菲猫      
--引用--------------------------------------------------
Anytao: 在这里我们通常用到执行查询就是foreach来做,当然有for语句也可以,但后者在效率上没有前者好
------------------------------------------------------
不敢苟同,从何说起?:-)

实际上,大部分情况下for的执行效率反而优于foreach,这种差别尤其是在.NET 2.0之前,以后在编辑器方面对foreach进行了很多优化,执行效率才变得不那么突出。

我想推荐foreach的原因,排除了性能上的差别,更多考虑的应该是以下几点:

1 foreach的简洁性,代码很漂亮;
2 foreach能够迭代多维数组
3 foreach能够自适应不同的类型转换
。。。

一家之言:-)

--------------------------------------------------------
喜欢foreach就在anytao说的1和2两点
  回复  引用  查看    
#13楼 2008-08-13 15:44 | larry_jun      
都扯远了哦,本期主题讨论的是Linq 。。。 ^_^