Linq简介
Linq这个词对于我们现在来说一点都不陌生了,因为它已经问世了好长时间了,而很多人都说Entity是Linq的完全版本,其实也不能完全这么说。各有各的优势。那么什么是Linq,它的全称是Language Integrated Query, 语言集成查询。那么什么是语言集成查询。
语言集成查询就是以相同的查询语法,查询,更新不同的数据源。
查询就是从数据源检索数据的表达式,我们知道,不同的数据源有不同的查询方式,我们查询SQL可以拼接SQL语句,我们查询XML需要使用XML的查询方式,我们查询集合有集合的查询方式,如果我们的数据源有1000种,或者10000种呢?我们就必须学习不同的1000种,10000种查询方式。而操作数据又是我们程序中不可或缺的部分。Linq就提供了一种统一针对不同数据源的查询方式,所以,不管我们的数据源是何种格式,我们的查询方式不变,需要变的只是我们的针对不同数据源的Ling提供程序。那么这样我们就实现了统一的查询语言。当然,要实现统一也不是那么简单的,我们要为每一个数据源编写提供程序也不是那么轻松的。
Linq to object就是linq查询object,如果字符串,集合。
Linq to sql就是linq查询sqlserver数据库。
Linq to XML就是linq查询XML。
一直有人说,linq to everything可以成为现实,我觉得也可能,那么就期待linq to everything的那一天吧
下面我们就来看看Linq是如何查询数据,和Linq相关的概念。
Linq查询分为三个步骤
1,获取数据源
2,创建查询
3,执行查询
获取数据源很简单,我们可以使暂时使用数组。其实概括起来很简单,支持泛型IEnumerable<T>接口或者从该接口继承的接口的任意对象。对于这些类型,不需要改动就可以直接使用,而非泛型IEnumerable接口,需要做一些额外的操作。下面会讲到,这里我们只是提一下。
int[] ints = { 2,3,4,6,8,19,30,38};
第二步,我们需要创建查询,创建查询有两种方式查询语法和方法语法。
查询语法&方法语法
查询语法是使用查询关键字组成查询表达式。.net本身并没有查询语法的概念,打个比方,.net同样不知道int[]. 之所以我们可以这样写,是编译器会帮我们翻译,帮我们转换成对应的.net可以识别的类或方法。这里查询语法会翻译成方法语法,就是调用最终的扩展方法。我们的提供程序实现类型的扩展方法。然后调用方法,完成查询。方法语法实际上就是调用方法。这里简单的说提供程序定义方法,但是提供程序不是单单定义方法这么简单。
我们尽量使用查询语法,方便阅读。这里我们使用查询语法和方法语法做示例。我们下面创建查询
            var query = from i in ints
                        where i>8
                        select i;
这里就是一个简单的查询,看起来是不是很像SQL语法。from指定数据源,引入范围变量,where筛选,select查询。这就是一个查询。使用方法语法就是
var queryMothed = ints.Where(i => i > 8);
最终查询语法会变成方法语法。我们这里需要注意的有一点,就是查询变量本身并不执行任何操作并且不返回任何数据,它只是存储在以后的某个时刻执行查询时为生成结果而必须的信息。这里的查询变量只是保存我们的变量和逻辑。以便在以后执行查询的时候调用变量和逻辑完成数据查询
真正的查询会发生在迭代查询变量的时候,这里有点难理解。为什么我们的where明明就是返回IEnumerable<T>类型的对象,而这个对象却不保存数据。你可以看成这个方法最终确实会返回这个类型,而在创建查询阶段,它并没有实际的返回,当我们迭代它的时候才会执行。其实道理很简单,就像我们定义一个引用类型的变量。定义这个变量我们只是定义了一个指向这个对象的引用,我们只有在使用这个变量操作对象的时候,实际的在对象上的操作才会发生,这里其实是相同的道理,查询变量只是一个变量,存储必要信息。等到使用的时候才执行真正的查询。
我们迭代查询变量
            foreach (int i in query)
            {
                Console.WriteLine(i);
            }
            Console.WriteLine("--------");
            foreach (int i in queryMothed)
            {
                Console.WriteLine(i);
            }
这个时候才会真正的执行查询,就像string s="E";s.XXX=XXX.第二句代码才会真正的操作对象是一样。那么如果我们在创建查询的时候就想让查询立即执行得到数据呢?我们可以强制立即执行。
            var query = (from i in ints
                        where i>8
                        select i).ToList<int>();
            var queryMothed = ints.Where(i => i > 8).ToList<int>();
这是得到一个List<T>,我们也可以得到一个单数
            var query = (from i in ints
                         where i > 8
                         select i).Average();
            var queryMothed = ints.Where(i => i > 8).Average();
这里我们还有很多的方法可以操作查询变量,以后Linq系列文章中会详细介绍
范围变量
from i in ints,这里的i就是范围变量,范围变量类似于迭代变量,但是这里不发生迭代。范围变量的作用是引用集合中的元素,以便对元素进行类似于筛选的操作

                
            
        
浙公网安备 33010602011771号