C#学习笔记(八)—–LINQ查询的基础知识(下)

来源:互联网 发布:杭州女装淘宝一件代发 编辑:程序博客网 时间:2024/05/17 07:29

LINQ查询语法和SQL语法的对比

  • LINQ查询语法看起来和SQL语法非常相似,但他们完全不同。LINQ查询表达式是一种C#表达式,遵循C#的语法规则,例如,在LINQ中,变量必须在声明之后才能使用,与之不同的是在SQL中,select后面可以直接跟列明,而这些列所在的表在稍后的from子句中才能确定。(也就是说from这个子句在LINQ中被放到最前的原因)。
    在LINQ中,一个子查询实际上就是一个新的C#表达式,因此不需要使用专门的子查询运算符,而在SQL中,使用子查询要遵循特殊的语法规则。
    在LINQ查询过程中,数据的处理顺序一直是从左向右进行的;而在SQL中,数据的处理顺序是不确定的。
    另外,在LINQ中,在处理数据过程中,集合中的元素始终保持一种有序的状态;而在SQL的查询过程中,数据始终是以一种网状的结构存在,没有顺序的概念。

查询表达式语法与运算符流语法的区别

这两个表达式语法各有优势。
在包含以下运算符的查询操作中,使用查询表达式更方便:
①在查询中使用let子句导入新的查询变量。
②在查询中用到SelectMany、Join或者GroupJoin这些运算符。
对于只包含Where、Orderby或者Select的查询语句,这两种查询方式都可以。
一般来说,查询表达式语法由单个的运算符组成,结构比较清晰;而运算符流语法写出的代码相对简洁。

  • 最后是适合使用运算符流语法书写的情况,很多查询运算符在表达式语法中没有相应的关键字,这时只能使用运算符流的方式进行查询,至少应该部分使用。在不含以下运算符的查询中,选用运算符流语法进行查询会更加方便:
Where, Select, SelectManyOrderBy, ThenBy, OrderByDescending, ThenByDescendingGroupBy, Join, GroupJoin

混合查询语法

如果一个查询运算符没有合适的查询语法,那么沃恩可以混合使用量上面介绍的两种方式来得到最终结果。这样做的唯一显示只是,在整个查询中,每个查询表达式的表述必须是完整的,例如,必须有from字句开始,select或者group子句结束。
假设有这样一个数组:

string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };

下面这个表达式用于查询集合names中包含字母a的单词个数:

int matches = (from n in names where n.Contains ("a") select n).Count();// 3

下面这个表达式首先对集合进行排序,然后返回排序数组中第一个元素L

string first = (from n in names orderby n select n).First(); // Dick

在比较复杂查询中,这种混合使用两种查询语法进行查询的放射科非常高效,上面的两个示例,实际上也可以直接使用运算符流语法进行书写:

int matches = names.Where (n => n.Contains ("a")).Count(); // 3string first = names.OrderBy (n => n).First(); // Dick

提示:有时,即使混合使用了两种查询语法,也没有写出真正简练的LINQ查询,但注意不要因此养成只是用一种查询语法的习惯,如果习惯只使用一种语法形式,在遇到复杂查询情况时,很难找到一种真正高效的方式去解决问题。