> For the complete documentation index, see [llms.txt](https://monksoul.gitbook.io/hoa/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://monksoul.gitbook.io/hoa/shujukucaozuoshinan/chaxunjieguojiyingshe.md).

# 9.7、查询结果集映射

我们总是将查询结果集进行筛选以选择我们必要的数据。

## 结果集映射好处

数据查询结果集映射也是一个非常重要的功能，此功能能够**保护数据安全性**，又能**提高查询性能**，也能**减少网络传输大小**。

所以，这里单独拿出一个章节去介绍查询结果集映射。

## 常见示例

比如我们的 `Test` 表有以下字段：

| Id | Name | Age | CreatedTime         | CreatedBy | FakeDelete |
| -- | ---- | --- | ------------------- | --------- | ---------- |
| 1  | Monk | 27  | 2020-05-21 13:20:30 | SA        | 0          |
| 2  | SNRC | 30  | 2020-05-21 19:20:30 | Monk      | 1          |

### Linq/Lambda 自带筛选

默认情况下，我们查询数据库数据会返回所有列数据，包括系统记录字段等这些无需传输给前端的数据。所以，我们可通过 `Linq/Lambda` 自带的 `Select` 方法进行筛选。如：

```csharp
var dtos = _testRepository.Entity
                .Where(u => u.Age > 26)
                .Select(u => new DtoModel(){ u.Id, u.Name, u.Age });
```

这样生成的 `Sql` 语句只会包含 `Id, Name, Age` 三个字段，这正式我们想要的。

### 如果筛选的字段很多怎么办？

如果 `Select` 筛选的字段很多，我们可以通过 `ProjectToType<Dto>` 方式，这样可以让我们的代码更加简洁且不易出错。如：

```csharp
var dtos = _testRepository.Entity
                .Where(u => u.Age > 26)
                .ProjectToType<DtoModel>();
```

看，是不是更加简单啦！😊

## 查询数据返回后再映射

`ProjectToType` 只能处理简单的一一映射模式，如需更加复杂的映射配置，可查看 [八、对象映射指南](https://monksoul.gitbook.io/hoa/duixiangyingshe) 章节。

常见用法是：`.ToList()` 之后接着调用 `Adapt<Dto>()`。
