C# LINQ使用介绍

LINQ(Language-Integrated Query)是C#语言的一个强大特性,它允许开发者用声明性的方式查询和操作数据。LINQ提供了一致的查询体验,无论是操作内存中的对象(如数组或集合),还是操作外部数据源(如数据库、XML文档或远程服务)。它内置于.NET Framework中,并且可以与任何实现了IEnumerable接口的数据集合一起使用。

LINQ的主要特性:

  1. 查询语法:LINQ提供了类似于SQL的查询语法,允许开发者以几乎相同的方式对不同类型的数据源进行查询。

  2. 强类型:LINQ是强类型的,这意味着在编译时就可以检查类型错误。

  3. 延迟执行:LINQ查询通常是延迟执行的,也就是说,查询表达式本身不会立即执行,直到你迭代结果时才会执行。

  4. 支持多种数据源:LINQ可以用于查询多种数据源,如LINQ to Objects、LINQ to XML、LINQ to SQL、LINQ to Entities(Entity Framework)等。

LINQ的查询方式:

  1. 查询表达式 :这种方式看起来很像SQL语句,使用fromwhereselectorderby等关键字。

    csharp 复制代码
    var query = from p in people
                where p.LastName == "Doe"
                orderby p.FirstName
                select p;
  2. 方法链 :也称为扩展方法语法,使用点号.和一系列扩展方法来构建查询。

    csharp 复制代码
    var query = people.Where(p => p.LastName == "Doe")
                      .OrderBy(p => p.FirstName)
                      .Select(p => p);

LINQ查询操作的例子:

假设有一个Person对象的列表,你可以使用LINQ来进行各种查询:

csharp 复制代码
List<Person> people = GetPeople(); // 假设这个方法返回人员列表

// 使用查询表达式语法获取姓氏为"Doe"的所有人员
var result = from person in people
             where person.LastName == "Doe"
             select person;

// 使用方法链语法做同样的查询
var result = people.Where(person => person.LastName == "Doe");

// 按名字排序
var sortedPeople = people.OrderBy(person => person.FirstName);

// 获取第一个名字以"J"开头的人
var personWithJ = people.FirstOrDefault(person => person.FirstName.StartsWith("J"));

// 检查是否存在任何姓氏为"Doe"的人
bool anyDoe = people.Any(person => person.LastName == "Doe");

// 计算姓氏为"Doe"的人的数量
int countDoe = people.Count(person => person.LastName == "Doe");

LINQ不仅仅限于简单的过滤和选择操作,它还支持分组、联接、聚合等复杂操作。LINQ的这种功能丰富性和灵活性使得它成为C#中处理数据的强大工具。

以下是一些高级用法的例子:

分组(Grouping)

使用group关键字可以将数据集合中的项按照某个键分组。这在你需要按照某个属性将数据分批处理时非常有用。

csharp 复制代码
var groupedResult = from p in people
                    group p by p.LastName into g
                    select new { LastName = g.Key, Persons = g };

// 使用方法语法
var groupedResult = people.GroupBy(p => p.LastName)
                          .Select(g => new { LastName = g.Key, Persons = g });

在上面的例子中,people集合被按照LastName属性分组。结果是一个新的集合,每个元素都包含一个键(LastName)和一个子集合(Persons)。

联接(Joining)

LINQ允许你使用join操作符来联接两个序列的元素,基于匹配的键。

csharp 复制代码
var joinQuery = from p in people
                join o in orders on p.ID equals o.PersonID
                select new { p.FirstName, p.LastName, o.OrderNumber };

// 使用方法语法
var joinQuery = people.Join(orders,
                            person => person.ID,
                            order => order.PersonID,
                            (person, order) => new { person.FirstName, person.LastName, order.OrderNumber });

在这个例子中,peopleorders两个集合基于人的ID属性和订单的PersonID属性被联接在一起。

左外联接(Left Outer Join)

左外联接与内联接不同,即使在右侧的序列中没有匹配项,左侧序列的每个元素也会返回。在LINQ中,你可以使用DefaultIfEmpty方法来实现左外联接。

csharp 复制代码
var leftOuterJoinQuery = from p in people
                         join o in orders on p.ID equals o.PersonID into po
                         from suborder in po.DefaultIfEmpty()
                         select new { p.FirstName, p.LastName, OrderNumber = suborder?.OrderNumber ?? "No order" };

// 使用方法语法
var leftOuterJoinQuery = people.GroupJoin(orders,
                                          person => person.ID,
                                          order => order.PersonID,
                                          (person, orders) => new { person, orders })
                               .SelectMany(
                                    z => z.orders.DefaultIfEmpty(),
                                    (person, order) => new { person.person.FirstName, person.person.LastName, OrderNumber = order?.OrderNumber ?? "No order" }
                                );

这里,即使某个人没有任何订单,也会在结果中返回该人的信息,同时显示"没有订单"。

聚合(Aggregation)

LINQ提供了多种聚合操作,如SumCountMinMaxAverage。这些可以直接在集合上调用,也可以在分组操作后调用。

csharp 复制代码
// 计算所有订单的总金额
var totalAmount = orders.Sum(o => o.Amount);

// 获取每个人的订单数量
var orderCounts = from p in people
                  join o in orders on p.ID equals o.PersonID into g
                  select new { p.FirstName, p.LastName, OrderCount = g.Count() };

// 使用方法语法
var orderCounts = people.GroupJoin(orders,
                                   person => person.ID,
                                   order => order.PersonID,
                                   (person, orders) => new { person.FirstName, person.LastName, OrderCount = orders.Count() });

在这些例子中,你可以看到如何计算总金额,以及如何联接两个集合以获取每个人的订单数量。

通过使用这些高级操作,你可以构建复杂的查询来处理和分析数据。LINQ的这些功能极大地简化了在.NET中的数据操作。

相关推荐
IT技术分享社区6 小时前
C#实战:使用腾讯云识别服务轻松提取火车票信息
开发语言·c#·云计算·腾讯云·共识算法
△曉風殘月〆13 小时前
WPF MVVM入门系列教程(二、依赖属性)
c#·wpf·mvvm
逐·風15 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
m0_6569747418 小时前
C#中的集合类及其使用
开发语言·c#
九鼎科技-Leo18 小时前
了解 .NET 运行时与 .NET 框架:基础概念与相互关系
windows·c#·.net
九鼎科技-Leo20 小时前
什么是 ASP.NET Core?与 ASP.NET MVC 有什么区别?
windows·后端·c#·asp.net·mvc·.net
.net开发20 小时前
WPF怎么通过RestSharp向后端发请求
前端·c#·.net·wpf
小乖兽技术20 小时前
C#与C++交互开发系列(二十):跨进程通信之共享内存(Shared Memory)
c++·c#·交互·ipc
幼儿园园霸柒柒21 小时前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节
平凡シンプル1 天前
C# EF 使用
c#