Ver código fonte

优化linq文档,修改其中的bug

wqj 3 anos atrás
pai
commit
b016450846
1 arquivos alterados com 18 adições e 0 exclusões
  1. 18 0
      csharp/11.linq.md

+ 18 - 0
csharp/11.linq.md

@@ -1,4 +1,5 @@
 # LINQ
+
 ## 什么是LIQN
 
 > 背景
@@ -12,6 +13,7 @@ LINQ,语言集成查询,全称是Language Integrated Query,是微软的一
 LINQ 通过提供处理各种数据源和数据格式的数据的一致模型,可以使用相同的基本编码模式来查询和转换 XML 文档、SQL 数据库、`ADO.NET` 数据集、.NET 集合中的数据。
 
 ## LINQ查询操作的三个部分
+
 > 所有的LINQ查询操作都由三个不同的操作组成。
 
 - 获取数据源
@@ -47,6 +49,7 @@ class IntroToLINQ
 <font color="red">通过上述代码我们可以看出,在LINQ中,查询的执行不同于查询本身,换句话说就是仅通过创建查询变量是不会检索到任何数据的。</font>
 
 ### 数据源
+
 支持 IEnumerable<T> 或派生接口(如泛型 IQueryable<T>)的类型称为可查询类型。
 
 上例中,数据源是一个数组,因此它隐式支持泛型 `IEnumerable<T>` 接口。这一事实意味着该数据源可以用 LINQ 进行查询。 
@@ -54,6 +57,7 @@ class IntroToLINQ
 查询在 foreach 语句中执行,且 foreach 需要 IEnumerable 或 IEnumerable<T>。
 
 ### 查询
+
 查询指定要从数据源中检索的信息。 查询还可以指定在返回这些信息之前如何对其进行排序、分组和结构化。 查询存储在查询变量中,并用查询表达式进行初始化。
 
 为使编写查询的工作变得更加容易,C# 引入了新的查询语法。
@@ -66,12 +70,15 @@ class IntroToLINQ
 需要注意的是,在 LINQ 中,查询变量本身不执行任何操作并且不返回任何数据。 它只是存储在以后某个时刻执行查询时为生成结果而必需的信息。 
 
 ### 查询执行
+
 #### 延迟执行
+
 如前所述,查询变量本身只存储查询命令。 查询的实际执行将推迟到在 foreach 语句中循环访问查询变量之后进行。 此概念称为延迟执行。
 
 `foreach` 语句也是检索查询结果的地方。 例如,在上一个查询中,迭代变量 num 保存了返回的序列中的每个值(一次保存一个值)。
 
 #### 强制立即执行
+
 对一系列源元素执行聚合函数的查询必须首先循环访问这些元素。 `Count`、`Max`、`Average` 和 `First` 就属于此类查询。 这些类型的查询返回单个值,而不是 IEnumerable 集合。
 ```csharp
 var evenNumQuery =
@@ -99,9 +106,11 @@ var numQuery3 =
 此外,还可以通过在紧跟查询表达式之后的位置放置一个 foreach 循环来强制执行查询。 但是,通过调用 ToList 或 ToArray,可以将所有数据缓存在单个集合对象中。
 
 ## 基本的LINQ查询操作
+
 本节简要介绍了 LINQ 查询表达式和一些在查询中执行的典型操作。
 
 ### 准备测试用的数据
+
 ```csharp
 _dtDemo.Columns.Add("NO",typeof(string));
 _dtDemo.Columns.Add("Name", typeof(string));
@@ -133,6 +142,7 @@ _dtDemo1.Rows.Add("6", "科技");
 ```
 
 ### LINQ基本语法之select
+
 >和SQL命令中的select作用相似但位置不同,查询表达式中的select及所接子句是放在表达式最后并把子句中的变量也就是结果返回回来。
 
 **返回DataRow集合**
@@ -163,6 +173,7 @@ var result = _dtDemo.AsEnumerable().Select(x=> new { Name = x.Field<string>("Nam
 ```
 
 ### LINQ语法之嵌套查询形式
+
 返回的结果集中,有属性也一个集合类,可以采用嵌套查询的形式进行
 ```csharp
 var result = from r in _dtDemo.AsEnumerable()
@@ -180,6 +191,7 @@ var result = _dtDemo.AsEnumerable().Select(x => new { Name = x.Field<string>("Na
 ```
 
 ### LINQ语法之Distinct
+
 筛选字段中不重复的值,用于查询不重复的结果集。
 
 **返回不重复的兴趣爱好**
@@ -193,6 +205,7 @@ var result = _dtDemo1.AsEnumerable().Select(x => x.Field<string>("Interest")).Di
 ```
 
 ### LINQ语法之where
+
 where关键字的适用场景:过滤数据
 
 说明:与SQL的where关键字的作用相似,都是起到范围限定,也就是数据过滤的作用。判断条件就是跟在where关键字后面的字句。
@@ -241,6 +254,7 @@ First方法用于返回集合中的第一行数据,其本质类似于SQL语句
 var result = _dtDemo.AsEnumerable().First(x => x.Field<string>("Sex") == "女")["Name"];
 ```
 ### LINQ语法之Count/Sum/Min/Max/Avg
+
 **Count**
 
 返回集合中元素的个数,int类型。
@@ -334,6 +348,7 @@ var result = _dtDemo.AsEnumerable().GroupBy(x => x.Field<string>("Sex")).Select(
 ```
 
 ### Linq语法之Join
+
 **等值连接**
 
 获取人员及其兴趣
@@ -360,6 +375,7 @@ var result = from r in _dtDemo.AsEnumerable()
 上面的语法中以_dtDemo为左表,以_dtDemo1为右表,当右表中的值为空时,用null值填充。Join的结果放到临时表temp中,然后通过调用临时表的DefaultIfEmpty方法左外连接的集合(如果不用该方法,则获取不到左表有,右表没有的数据)。
 
 ### Linq语法之Order By
+
 对查询出的数据进行排序
 
 **简单排序**
@@ -414,6 +430,7 @@ var result = _dtDemo.AsEnumerable().OrderBy(x => x.Field<string>("Sex")).ThenBy(
 var result = _dtDemo.AsEnumerable().OrderBy(x => x.Field<int>("Age")).OrderBy(x => x.Field<string>("Sex")).Select(x => new { Name = x.Field<string>("Name"), Sex = x.Field<string>("Sex"), Age = x.Field<int>("Age") });
 ```
 ### Linq语法之GroupBy/Where
+
 **简单语法**
 
 按照性别分组
@@ -512,6 +529,7 @@ var result = _dtDemo.AsEnumerable().Join(_dtDemo1.AsEnumerable(), r => r.Field<s
 ```
 
 ### Linq语法之调用本地方法
+
 在一些查询中需要对一些字段进行加工处理,但是在linq语法中不好实现,可以通过调用本地方法的方式实现
 返回人员及兴趣爱好,兴趣爱好转化为英文显示
 ```csharp