在C#中使用Linq


前言

LINQ(Language Integrated Query)是 C# 中一种强大的查询语言集成特性,它使得在编程语言级别对数据进行查询和操作变得更加简单和直观。通过 LINQ,开发人员可以使用类似 SQL 的语法来对各种数据源进行查询,包括集合、数据库、XML 等,从而提高代码的可读性、减少编写代码的工作量,并且更容易理解和维护。本文将全面介绍 LINQ 的各种用法和优势。


一、基本查询操作

查询表达式
LINQ 查询表达式是一种特殊的语法,使得数据查询操作更加直观和易读。下面是一个简单的 LINQ 查询表达式的示例:

var numbers = new int[] { 1, 2, 3, 4, 5 };
var evenNumbers = from num in numbers
                  where num % 2 == 0
                  select num;

foreach (var num in evenNumbers)
{
    Console.WriteLine(num); // 输出:2 4
}

在上面的示例中,我们使用 from 关键字定义查询范围,使用 where 关键字添加条件,使用 select 关键字选择需要的结果。

标准查询运算符
标准查询运算符是 LINQ 查询的核心,它包括了一系列用于查询和操作数据的方法。下面是一些常用的标准查询运算符及其示例:

var numbers = new int[] { 1, 2, 3, 4, 5 };

// Where 运算符:筛选出符合条件的元素
var evenNumbers = numbers.Where(num => num % 2 == 0);

// Select 运算符:将元素投影到新的形式
var squares = numbers.Select(num => num * num);

// OrderBy 运算符:按照指定的条件对元素进行排序
var sortedNumbers = numbers.OrderBy(num => num);

// GroupBy 运算符:根据指定的条件对元素进行分组
var groups = numbers.GroupBy(num => num % 2 == 0 ? "Even" : "Odd");

以上代码演示了如何使用 LINQ 的常用标准查询运算符对数据进行操作。

二、高级查询操作

延迟执行与立即执行
LINQ 查询具有延迟执行和立即执行的特性。延迟执行意味着查询表达式不会立即执行,直到需要获取结果时才会执行。立即执行则是指查询表达式在定义时立即执行。下面是延迟执行和立即执行的示例:

var numbers = new int[] { 1, 2, 3, 4, 5 };

var query = numbers.Where(num => num % 2 == 0); // 这里只是定义查询,并不会立即执行

// 延迟执行
foreach (var num in query)
{
    Console.WriteLine(num); // 输出:2 4
}

// 立即执行
var result = query.ToList(); // 查询结果在这里立即执行

复合查询
复合查询是指将多个查询组合在一起,实现复杂的查询操作。可以通过链式调用或嵌套查询来实现复合查询。下面是一个复合查询的示例:

var numbers = new int[] { 1, 2, 3, 4, 5 };

var query = numbers.Where(num => num % 2 == 0)
                   .OrderByDescending(num => num)
                   .Select(num => num * num);

foreach (var num in query)
{
    Console.WriteLine(num); // 输出:16 4
}

在上面的示例中,我们首先筛选出偶数,然后按照降序排序,并最后计算平方。

LINQ 到对象
LINQ to Objects
LINQ to Objects 是 LINQ 中最基础和常用的一种形式,用于对内存中的对象集合进行查询和操作。下面是一个 LINQ to Objects 的示例:

var persons = new List<Person>
{
    new Person { Name = "Alice", Age = 30 },
    new Person { Name = "Bob", Age = 25 },
    new Person { Name = "Charlie", Age = 35 }
};

var query = from person in persons
            where person.Age > 30
            select person.Name;

foreach (var name in query)
{
    Console.WriteLine(name); // 输出:Charlie
}

在上面的示例中,我们使用 LINQ 查询出年龄大于 30 岁的人员的姓名。

三、数据库查询

LINQ to SQL
LINQ to SQL 是一种用于通过 LINQ 查询和操作关系型数据库的技术。通过 LINQ to SQL,可以使用 LINQ 查询语法来执行 SQL 查询并将结果映射到.NET对象中。以下是一个简单的 LINQ to SQL 示例:

using (var dbContext = new MyDbContext())
{
    var query = from p in dbContext.Products
                where p.Price > 100
                select p;

    foreach (var product in query)
    {
        Console.WriteLine($"{product.Name} - {product.Price}");
    }
}

在上面的示例中,我们使用 LINQ 查询语法从名为 Products 的数据库表中查询出价格大于 100 的产品。

Entity Framework
Entity Framework 是.NET框架中一个强大的对象关系映射(ORM)框架,它支持 LINQ 查询和操作数据库。以下是一个简单的 Entity Framework 示例:

using (var dbContext = new MyDbContext())
{
    var query = dbContext.Products
                       .Where(p => p.Price > 100)
                       .OrderByDescending(p => p.Price)
                       .Select(p => new { p.Name, p.Price });

    foreach (var product in query)
    {
        Console.WriteLine($"{product.Name} - {product.Price}");
    }
}

在上面的示例中,我们使用 Entity Framework 进行查询,并选择产品名称和价格。

四、文件和 XML 查询

LINQ to XML
LINQ to XML 提供了一种方便的方式来查询和操作 XML 数据。以下是一个简单的 LINQ to XML 示例:

XDocument doc = XDocument.Load("books.xml");

var query = from book in doc.Descendants("book")
            where (int)book.Element("price") > 10
            select new
            {
                Title = book.Element("title").Value,
                Price = (decimal)book.Element("price")
            };

foreach (var book in query)
{
    Console.WriteLine($"{book.Title} - {book.Price}");
}

在上面的示例中,我们从名为 books.xml 的 XML 文件中查询出价格大于 10 的书籍的标题和价格。

LINQ to DataSet
LINQ to DataSet 使得可以通过 LINQ 查询和操作 DataSet 和 DataTable 中的数据。以下是一个简单的 LINQ to DataSet 示例:

DataTable table = new DataTable();
table.Columns.Add("Name", typeof(string));
table.Columns.Add("Age", typeof(int));

table.Rows.Add("Alice", 30);
table.Rows.Add("Bob", 25);
table.Rows.Add("Charlie", 35);

var query = from row in table.AsEnumerable()
            where row.Field<int>("Age") > 30
            select row.Field<string>("Name");

foreach (var name in query)
{
    Console.WriteLine(name); // 输出:Charlie
}

在上面的示例中,我们从 DataTable 中查询出年龄大于 30 岁的人员的姓名。

五、总结

LINQ 的各种查询操作和用法,包括基本查询操作、高级查询操作、LINQ 到对象、数据库查询、文件和 XML 查询等,提高开发效率和代码质量。

相关推荐

  1. C#使用Linq

    2024-03-11 03:38:01       44 阅读
  2. C# 使用 LINQ 示例 备忘

    2024-03-11 03:38:01       26 阅读
  3. C#LINQ(Language-Integrated Query)

    2024-03-11 03:38:01       31 阅读
  4. C#使用LINQ和EF Core

    2024-03-11 03:38:01       41 阅读
  5. c#使用linq封装分页查询

    2024-03-11 03:38:01       39 阅读
  6. LINQC#】

    2024-03-11 03:38:01       55 阅读
  7. <span style='color:red;'>C</span># <span style='color:red;'>LINQ</span>

    C# LINQ

    2024-03-11 03:38:01      44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 03:38:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 03:38:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 03:38:01       87 阅读
  4. Python语言-面向对象

    2024-03-11 03:38:01       96 阅读

热门阅读

  1. 读取CSV数据并写入MySQL

    2024-03-11 03:38:01       40 阅读
  2. G1垃圾收集器

    2024-03-11 03:38:01       36 阅读
  3. 使用Golang开发以太坊(一)

    2024-03-11 03:38:01       41 阅读
  4. 【Vue3】Ref 和 ShallowRef 的区别

    2024-03-11 03:38:01       46 阅读
  5. MySQL和Redis Common Command

    2024-03-11 03:38:01       46 阅读
  6. 什么是生活?(2024-2-26)

    2024-03-11 03:38:01       51 阅读
  7. vim基本使用

    2024-03-11 03:38:01       43 阅读
  8. 京东面试官问我,你在catch块中写业务代码吗?

    2024-03-11 03:38:01       56 阅读
  9. Docker容器管理的内容与作用

    2024-03-11 03:38:01       45 阅读