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中进行多表联查:

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

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子句将customersorders列表连接起来,连接条件是它们的CustomerId字段相等。然后,我们使用select子句选择需要的字段,并创建一个匿名类型对象。最后,我们通过foreach循环遍历查询结果,并打印每个联查结果的CustomerOrder字段。


假设我们有两个列表: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()方法。这取决于你更喜欢使用哪种语法风格。无论使用哪种方式,都要确保连接条件正确匹配,并选择需要的字段进行投影。

相关推荐
军训猫猫头1 小时前
20.抽卡只有金,带保底(WPF) C#
ui·c#·wpf
向宇it11 小时前
【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法
java·开发语言·unity·c#·游戏引擎
向宇it13 小时前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
坐井观老天17 小时前
在C#中使用资源保存图像和文本和其他数据并在运行时加载
开发语言·c#
pchmi20 小时前
C# OpenCV机器视觉:模板匹配
opencv·c#·机器视觉
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭21 小时前
C#都可以找哪些工作?
开发语言·c#
boligongzhu1 天前
Dalsa线阵CCD相机使用开发手册
c#
向宇it1 天前
【从零开始入门unity游戏开发之——C#篇23】C#面向对象继承——`as`类型转化和`is`类型检查、向上转型和向下转型、里氏替换原则(LSP)
java·开发语言·unity·c#·游戏引擎·里氏替换原则
sukalot1 天前
windows C#-命名实参和可选实参(下)
windows·c#