Linq的简介和基础知识学习

学习LINQ之前,我们要知道LINQ是干什么,解决什么问题的,怎样学习?

一、LINQ简介

1、什么是LINQ?

  什么是LINQ?LINQ中文翻译为语言集成查询(Language Integrated Query),更通俗的讲,它相当于一个通用的数据查询接口。LINQ最初由Anders hejlsberg构思,20071119日,

LINQ作为.NET FrameWork3.5的一部分正式发布,同时微软也将LINQ集成到了Visual Studio 2008中,这一巨大的创新,实现了面向对象和数据访问的互通有无。

2、LINQ主要解决什么问题?

  我们知道在LINQ之前,面向对象和数据访问这两个领域是相互分裂的,编程语言中的数据类型,和数据库中的数据类型也有一些出入,同时SQLXML都有自己的查询语言

而对象却没有自己的查询语言,这些在很大程度上限制开发的效率,而LINQ的设计理念就是在不同类型的数据之间(关系数据、层次模型数据等)之间实现数据访问的互通有无,

为不同的数据类型提供统一的访问接口。

3、学习LINQ需要做哪些基本准备

  在开始学习LINQ之前,我们需要先来了解下理解C# 3.0的一些新特性:隐含类型局部变量、自动属性、对象初始化器、集合初始化器、匿名类型、Lambda表达式、

扩展方法、局部方法、yield和IEnumerable接口、查询语法等

二、LINQ查询分类

1、Linq to Objects

  主要负责对象查询

2、Linq to XML

  主要负责XML查询

3、LInq to ADO.Net

  主要负责数据库查询,Linq to ado.Net 又分为Linq to Sql(语法查询),Linq to DataSet(数据查询),Linq to Entity(实体查询)

三、基础知识的学习

1、隐含类型局部变量

  隐含类型var, 我们都知道Javascript是一种弱类型的语言,所以在运行的时候才会更加的灵活。我们现在所接触的语言大部分都是强类型的语言,

所谓强类型的语言,就是程序声明的变量、实例化对象,必须有明确的类型规定,这样在编译的时候就为其分配一定的内存空间,这样的话代码的

的安全性就比较高,为了提高程序的运行效率和灵活性,微软也把var给引进了进来

        static void Main(string[] args)
        {

            #region 隐含类型变量var用法
          
            //定义 string 
            var name = "张晓峰";
            //定义 int
            var age = 26;
            //定义 string[]
            var peoples = new[] { "张三", "李四", "王五" };
            //输出保存的值
            Console.WriteLine("名字:"+name);
            Console.WriteLine("年龄:" + age);
            foreach (var p in peoples) {
                Console.WriteLine("姓名:"+ p);
            }

            #endregion

            //保证控制台不一闪而过
            Console.ReadLine();
        }

输出结果:

编译器可以自动识别隐含类型的局部变量,但是前提是变量必须有值,但是在使用null之前,必须要确定类型,例如:var test=(string)null;

这样编译器可以自动的推断值类型,如果单纯的为test=null,则编译器无法识别其类型

2、自动属性

以前定义一个类中属性和方法需这样写

   public class People
    {
        private string name;
        private string sex;
        private int age;

        public string Name {
            get { return name; }
            set { name = value; }
        }

        public string Sex {
            get { return sex; }
            set { sex = value; }
        }

        public int Age {
            get { return age; }
            set { age = value; }
        }
    }

使用自动属性后,可以这样写,效果是同样的

   public class People
    {
        public string Name { get; set; }

        public string Sex { get; set; }

        public int Age { get; set; }
    }

3、对象初始化器

对象初始化器C#3.0之前和之后语法对比

        static void Main(string[] args)
        {

            #region 对象初始化器的使用

            //C#3.0之前的用法
            People p1 = new People();
            p1.Name = "张三";
            p1.Sex = "";
            p1.Age = 27;

            //C#3.0之后用法
            People p2 = new People() { Name = "李四", Sex = "", Age = 18 };

            //输出信息
            Console.WriteLine("人员信息:");
            Console.WriteLine("姓名:"+p1.Name+",性别:"+p1.Sex+",年龄:"+p1.Age);
            Console.WriteLine("姓名:" + p2.Name + ",性别:" + p2.Sex + ",年龄:" + p2.Age);
          
            #endregion

            //保证控制台不一闪而过
            Console.ReadLine();

        }

输出结果:

4、集合初始化器

集合初始化器C#3.0之前和之后写法比较

        static void Main(string[] args)
        {

            #region 集合对象初始化器的使用

            //C#3.0之前的用法
            List<People> peoples = new List<People>();
            People p1 = new People();
            p1.Name = "张三";
            p1.Sex = "";
            p1.Age = 27;
            People p2 = new People();
            p2.Name = "李四";
            p2.Sex = "";
            p2.Age = 18;
            peoples.Add(p1);
            peoples.Add(p2);
            //输出人员信息
            Console.WriteLine("人员信息如下:");
            foreach (People p in peoples)
            {
                Console.WriteLine("姓名:" + p.Name + ",性别:" + p.Sex + ",年龄:" + p.Age);
            }

            //C#3.0之后用法

            List<People> people1s = new List<People>() {
                 new People() { Name="王五",Sex="",Age=27},
                 new People() { Name="赵六",Sex="",Age=18}
            };

            //输出人员信息
            Console.WriteLine("\n人员信息如下:");
            foreach (People p in people1s)
            {
                Console.WriteLine("姓名:" + p.Name + ",性别:" + p.Sex + ",年龄:" + p.Age);
            }

            #endregion

            //保证控制台不一闪而过
            Console.ReadLine();

        }

输出结果:

5、匿名类型

和隐含类型的局部变量一样,匿名类型就是开发者自定义类型,无须显示定义。在LINQ中匿名类会常常用到。

使用方法如下:

 

        static void Main(string[] args)
        {
            #region 匿名类型使用

            var name = "玛丽";
            var sex = "";
            var age = 21;
            //匿名类型(实体类)
            var people = new{ Name = name, Sex = sex, Age = age};
            //输出信息
            Console.WriteLine("姓名:" + people.Name + ",性别:" + people.Sex + ",年龄:" + people.Age);

            #endregion

            //保证控制台不一闪而过
            Console.ReadLine();

        }

输出结果:

6、Lambea表达式

  Lambda表达式是由委托-->匿名函数-->Lambda表达式一步步过度而来的

 

7、扩展方法

  扩展方法多用于对CLR类型一些操作的扩展,在3.0之前如果要实现这些操作,一般都是建

一下辅助类,扩展方法能方便的实现这些公共。

7.1、定义扩展方法需要注意的地方:

1)扩展方法只能只在静态类中定义并且是静态方法,

2)扩展方法不能与原有方法名冲突,否则将无效

3)扩展方法的参数必须为(this扩展类的类实例,Parameter p)7.2、例子实例

    class Program
    {
        
        static void Main(string[] args)
        {

            Console.WriteLine("LiSha".ShowLove());
            Console.ReadLine();
        }
    }

    #region string的扩展类

    public static class ExensionString 
    {
        public static string ShowLove(this string s) 
        {
            return "I Love," + s;
        }
    }
    #endregion

结果如下:

 

8、局部方法

  谈到局部方法,首先要说一下局部类,局部类是用partial修饰的类,可以由多个partial修饰的同名类组合成一个类,局部方法是3.0以后加入的特性,局部方法必须定义在局部类中,但是局部方法的定义和实现可以分开。在这里同时要注意,局部方法的返回值必须是静态的,返回值必须是void,可以有参也可以无参,有无方法实现均可。

9、yieId

10、IEnumerable接口

 

Ps:

学习网址:http://blog.csdn.net/xuemoyao/article/details/8047513

   

posted @ 2017-05-05 18:17  小小邪  阅读(783)  评论(0编辑  收藏  举报