C#的LINQ查询

当使用LINQ(Language Integrated Query)查询时,我们可以在C#中以一种类似于SQL的语法来查询数据。LINQ提供了一种统一的方式来查询各种数据源,如集合、数据库、XML等。

在上述示例中,我们使用LINQ查询来将两个列表根据ID值进行连接和选择。

以下是对LINQ查询的详细解释和其他常见用法的示例:

  1. 查询表达式语法:
    • 使用from子句指定要查询的数据源和范围变量。
    • 使用join子句连接两个数据源的特定字段。
    • 使用equals关键字指定连接条件中的相等比较。
    • 使用select子句选择查询结果的字段并创建新的对象。
    • 使用ToList()方法将查询结果转换为列表。
csharp 复制代码
List<Item> itemList = new List<Item>
{
    new Item { Id = 1, Name = "Item 1" },
    new Item { Id = 2, Name = "Item 2" },
    new Item { Id = 3, Name = "Item 3" }
};

List<Result> resultList = new List<Result>
{
    new Result { Id = 1, Name = "Result 1" },
    new Result { Id = 3, Name = "Result 3" }
};

List<Item> combinedList = (from i in itemList
                           join r in resultList on i.Id equals r.Id
                           select i).ToList();

foreach (var item in combinedList)
{
    Console.WriteLine($"ID: {item.Id}, Name: {item.Name}");
}
  1. 查询方法语法:
    • 使用Where()方法筛选满足条件的元素。
    • 使用OrderBy()方法按指定的条件对元素进行排序。
    • 使用GroupBy()方法根据指定的条件对元素进行分组。
    • 使用FirstOrDefault()方法获取符合条件的第一个元素。
    • 使用Any()方法判断是否存在满足条件的元素。
    • 使用Count()方法计算满足条件的元素数量。
csharp 复制代码
List<Item> itemList = new List<Item>
{
    new Item { Id = 1, Name = "Item 1" },
    new Item { Id = 2, Name = "Item 2" },
    new Item { Id = 3, Name = "Item 3" }
};

// 使用Where()方法筛选满足条件的元素
List<Item> filteredList = itemList.Where(item => item.Id > 1).ToList();

// 使用OrderBy()方法按指定的条件对元素进行排序
List<Item> sortedList = itemList.OrderBy(item => item.Name).ToList();

// 使用GroupBy()方法根据指定的条件对元素进行分组
var groupedItems = itemList.GroupBy(item => item.Id);

// 使用FirstOrDefault()方法获取符合条件的第一个元素
Item firstItem = itemList.FirstOrDefault(item => item.Name.StartsWith("Item"));

// 使用Any()方法判断是否存在满足条件的元素
bool hasItemsWithNameStartingWithA = itemList.Any(item => item.Name.StartsWith("A"));

// 使用Count()方法计算满足条件的元素数量
int itemCount = itemList.Count(item => item.Id > 2);

这些示例展示了LINQ查询的常见用法,包括筛选、排序、分组、获取单个元素以及计算元素数量等。需要根据具体的需求选择适当的LINQ方法和语法来执行查询操作。


在LINQ中执行多表联查,可以使用join子句来连接多个数据源,并使用equals关键字指定连接条件。下面是一个示例,演示如何在LINQ中进行多表联查:

假设我们有两个实体类:Customer和Order,它们具有关联的字段CustomerId。我们想要通过CustomerId将两个实体类进行联查,获取具有相同CustomerId的Customer和Order对象。

csharp 复制代码
public class Customer
{
    public int CustomerId { get; set; }
    public string Name { get; set; }
}

public class Order
{
    public int OrderId { get; set; }
    public int CustomerId { get; set; }
    public string ProductName { get; set; }
}

List<Customer> customers = new List<Customer>
{
    new Customer { CustomerId = 1, Name = "Customer 1" },
    new Customer { CustomerId = 2, Name = "Customer 2" },
    new Customer { CustomerId = 3, Name = "Customer 3" }
};

List<Order> orders = new List<Order>
{
    new Order { OrderId = 1, CustomerId = 1, ProductName = "Product 1" },
    new Order { OrderId = 2, CustomerId = 2, ProductName = "Product 2" },
    new Order { OrderId = 3, CustomerId = 1, ProductName = "Product 3" }
};

var query = from c in customers
            join o in orders on c.CustomerId equals o.CustomerId
            select new { c.Name, o.ProductName };

foreach (var result in query)
{
    Console.WriteLine($"Customer: {result.Name}, Product: {result.ProductName}");
}

在上述示例中,我们使用join子句将customers和orders列表连接起来,连接条件是它们的CustomerId字段相等。然后,我们使用select子句选择需要的字段,并创建一个匿名类型对象。最后,我们通过foreach循环遍历查询结果,并打印每个联查结果的Customer和Order字段。


假设我们有两个列表:itemList和resultList,它们都包含具有Id和Name属性的对象。

通过使用LINQ查询语法,我们将这两个列表根据它们的Id字段进行连接,并选择itemList中的元素作为查询结果。

csharp 复制代码
List<Item> itemList = new List<Item>
{
    new Item { Id = 1, Name = "Item 1" },
    new Item { Id = 2, Name = "Item 2" },
    new Item { Id = 3, Name = "Item 3" }
};

List<Result> resultList = new List<Result>
{
    new Result { Id = 1, Name = "Result 1" },
    new Result { Id = 3, Name = "Result 3" }
};

List<Item> combinedList = (from i in itemList
                           join r in resultList on i.Id equals r.Id
                           select i).ToList();

foreach (var item in combinedList)
{
    Console.WriteLine($"ID: {item.Id}, Name: {item.Name}");
}
  1. 创建itemList和resultList:

    我们首先创建了itemList和resultList,分别包含了Item和Result对象的实例。每个对象都具有Id和Name属性,这些属性用于进行连接。

  2. 执行连接查询:

使用from子句将itemList中的每个元素赋值给变量i。

使用join子句将resultList中的元素赋值给变量r,并指定连接条件i.Id equals r.Id,表示当itemList中的元素的Id与resultList中的元素的Id相等时进行连接。

使用select子句选择i作为查询结果,即选择itemList中满足连接条件的元素。

  1. 将查询结果转换为列表:

使用ToList()方法将查询结果转换为List类型的列表,并将其赋值给变量combinedList。

  1. 遍历和打印结果:
    使用foreach循环遍历combinedList中的每个元素,并使用Console.WriteLine()方法打印每个元素的Id和Name属性。

在这个示例中,连接查询的结果将包含具有相同Id的Item和Result对象。输出将显示满足连接条件的Item对象的Id和Name属性。

例如,如果Item对象的Id为1和3,并且Result对象的Id也为1和3,则输出将是:

csharp 复制代码
ID: 1, Name: Item 1
ID: 3, Name: Item 3

需要注意的是,多表联查时,可以根据具体的需求选择使用join子句或方法语法中的Join()方法。这取决于你更喜欢使用哪种语法风格。无论使用哪种方式,都要确保连接条件正确匹配,并选择需要的字段进行投影。

相关推荐
宝桥南山3 小时前
.NET 11 - 尝试创建一下AGUIServer和AGUIClient(基于新版.NET SDK for AG-UI)
microsoft·ai·微软·c#·aigc·.net
czhc11400756633 小时前
加在入口还是出口 —— 以及一个“看着像文件夹“的文件
c#
波力海苔夹心脆6754 小时前
C# LINQ 入门到上手:一篇讲透查询语法、常用操作符与延迟执行(含示例与速查表
经验分享·c#·.net·solr·linq
此时不提桶,更待何时19 小时前
06-12-A-Kafka存储深水区与源码解析详解
分布式·kafka·linq
进击的大海贼1 天前
基于C#开发的久坐提醒工具
开发语言·c#
小羊没烦恼!1 天前
关于大型asp.net应用系统的架构-架构的选择
java·服务器·开发语言·前端·c#
小羊没烦恼!2 天前
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
java·开发语言·前端·数据库·算法·c#
UIU1142 天前
头文件可以防什么错?运用头文件做声明
c++·学习·c#
鑫 源2 天前
C#源码开源, 获取macOS 电池数据,包括iOS (xamarin开发)
c#·.net·xamarin