LINQ(Language Integrated Query,语言集成查询)是C#中的一种强大的数据查询工具,它将查询语法内置于编程语言中,使得数据操作更加简洁、直观。在C#中,LINQ主要通过`IEnumerable<T>`和`IQueryable<T>`接口来工作,支持多种数据源,包括数据库、XML、集合等。在本文档中,我们重点关注了如何使用LINQ与数据集(如DataTable)进行交互。
LINQ的基本查询语句通常由`from`、`where`、`select`等关键字构成。例如,以下代码片段展示了如何获取`DataTable`中所有记录:
```csharp
var result = from q in dt1.AsEnumerable()
select q;
```
这里的`AsEnumerable()`方法将`DataTable`转换为可枚举的数据集,便于使用LINQ操作。
接着,我们可以添加`where`子句来过滤数据。在下面的示例中,我们只选择名字为“张三”的记录:
```csharp
var result = from q in dt1.AsEnumerable()
where q.Field<string>("Name") == "张三"
select q;
```
`Field<T>`方法用于访问`DataRow`中的特定字段值,这里我们根据字段名“Name”获取字符串类型的值。
然后,可以使用`orderby`子句进行排序,如按姓名升序排列:
```csharp
var result = from q in dt1.AsEnumerable()
where q.Field<string>("Name") == "张三"
orderby q.Field<string>("Name")
select q;
```
若要同时选择多个字段并创建匿名类型,可以这样做:
```csharp
var result = from q in dt1.AsEnumerable()
where q.Field<string>("Name") == "张三"
orderby q.Field<string>("Name")
select new
{
Name = q.Field<string>("Name"),
Age = q.Field<int>("Age")
};
```
此外,`group by`关键字用于分组,配合`Sum`方法可以计算每个组的总和:
```csharp
var result = from q in dt1.AsEnumerable()
group q by q.Field<string>("Name") into g
select new
{
Name = g.Key,
Num = dt2.AsEnumerable()
.Where(r => r.Field<string>("Name") == g.Key)
.Sum(r => r.Field<double>("Number"))
};
```
这里,我们根据“Name”字段将记录分组,并计算出在`dt2`中相同名字记录的“Number”字段的总和。
`join`操作符用于连接两个数据集,以下代码演示了基于“Name”字段的内连接:
```csharp
var result = from q in dt1.AsEnumerable()
join r in dt2.AsEnumerable() on q.Field<string>("Name") equals r.Field<string>("Name")
select new
{
Name = q.Field<string>("Name"),
Av = q.Field<string>("AValue"),
};
```
使用`join`的另一种形式,即左连接,可以处理`dt2`中可能不存在匹配项的情况:
```csharp
var result = from q in dt1.AsEnumerable()
join r in dt2.AsEnumerable() on q.Field<string>("Name") equals r.Field<string>("Name") into d
from r in d.DefaultIfEmpty()
select new
{
Name = q.Field<string>("Name"),
Av = q.Field<string>("AValue"),
};
```
`DefaultIfEmpty()`方法确保即使在`dt2`中没有匹配项,也能返回一个默认值,这样就不会丢失`dt1`中的任何记录。
LINQ为C#程序员提供了一种优雅且强大的方式来处理各种数据源。通过使用`from`、`where`、`select`、`orderby`、`group by`和`join`等关键字,我们可以方便地进行数据过滤、排序、分组和连接,从而实现复杂的数据查询和操作。对于处理DataTable或其他数据集,这些技巧尤其有用。