C#数据处理LINQ语言集成查询

(Language Intergated Query)也就是语言集成查询

为什么要使用LINQ?

在工程中我们少不了要定义类或者结构去储存数据,这些数据将被临时地储存在内存中,现在我们想要对其完成一些类似于查找、过滤等等常见的任务的时候,我们该如何去做呢?
  我们可以自己写代码去对集合中的每个对象进行遍历,检查变量的每个字段看其是否满足条件。这样的故事已经发生太多次了,微软怎么可能容忍在C#里发生如此弱智的事情呢?于是,C#的设计者决定在C#中集成查询的语法,以最大限度地减少程序员书写类似代码的情况。
  这也就是我们说的LINQ(Language Intergated Query)也就是语言集成查询,我们可以使用同样的语法访问不同的数据源。

几乎所有的应用程序都需要对数据进行处理,大部分的程序都通过自定义的逻辑来完成这些操作。这样做的弊端之意就是,代码逻辑将会跟它处理的数据的结构紧密耦合在一起,如果数据结构发生了改变,也许将会带来海量的代码改动。
  为了解决这个问题,C#将这些处理数据的代码都抽象出来,提供给了广大开发者。这就是LINQ。
  LINQ的语法类似于关系和分层查询语言(SQL和XQuery),我们可以在不更改查询代码的情况下对数据结构进行更改。LINQ比之SQL要更加灵活,可以处理更广泛的逻辑数据结构。当然,这些数据结构都需要实现了IEnumerable或者IEnumerable< T >接口,才可以进行LINQ查询。

表达式基础语法

LINQ查询表达式以from子句开始,以select或者group子句结束。在这两个子句之间可以跟零个或者多个from、let、where、join或者orderby子句。

在C#3.0中,为Linq引入了一些新的关键字,他们是:

from join where group into let orderby select

熟悉Sql的同学看着是不是有些眼熟呢,其实在Linq中他们的涵义和在SQL中类似的,所以会很容易理解的。

  每个from子句都是一个生成器,该生成器将引入一个包括序列(Sequence)的元素的范围变量(range variable)。每个let子句都会引入一个范围变量,以表示通过前一个范围变量计算的值。每个where子句都是一个筛选器,用于从结果中排除项。每个join子句都将指定的源序列键与其他序列的键进行比较,以产生匹配对。每个orderby子句都会根据指定的条件对各项进行重新排序。而最后的select或者group子句根据范围变量来指定结果的表现形式。最后可以使用into子句来连接查询,将某一查询结果的视为后续查询的生成器。

标准查询操作符

 在了解LINQ查询表达式之前,怎么能不了解下它的查询操作符呢?

let子句的用法

let子句主要有2种用法:

1)创建一个可以用于查询自身的可枚举类型;

2)存储一个查询出来的临时变量以方便用于后续操作。

let子句也比较简单,我们通过一个例子来认识它。

我们要从一组句子中,找到所有以元音(a, e, i, o, u)开头的单词:

string [] sentences = new string[]{"It is a beautiful day today.",
                                                "Coding will change your life.",
                                                "The early bird chatches the worm."};
 
            var vowelWords = from sentence in sentences
                             let words = sentence.Split(' ')
                             from word in words
                             let lowerWord = word.ToLower()
                             where lowerWord[0] == 'a' ||
                                   lowerWord[0] == 'e' ||
                                   lowerWord[0] == 'i' ||
                                   lowerWord[0] == 'o' ||
                                   lowerWord[0] == 'u'
                             select word;
            foreach (var vowelWord in vowelWords)
            {
                    Console.WriteLine(vowelWord);
            }

在这个查询中,我们用了2个let子句,分别对应上述的2种用法。

第一个let子句:将句子根据空格分隔成单词,并将分隔后的words作为下一步查询的数据源;

第二个let子句:将每个单词转成小写,以方便后续的操作。

C#系 常用的LinQ查询表达式之let_杨勇博客之家-CSDN博客
 [深入学习C#]LINQ查询表达式详解(1)——基本语法、使用扩展方法和Lambda表达式简化LINQ查询_诗人江湖老的专栏-CSDN博客_linq表达式

猜你喜欢

转载自blog.csdn.net/qq_42672770/article/details/123413847