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

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, SelectMany
OrderBy, ThenBy, OrderByDescending, ThenByDescending
GroupBy, 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(); // 3
string first = names.OrderBy (n => n).First(); // Dick

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值