在 C# 中使用 Dapper 读取表的子集

Posted

技术标签:

【中文标题】在 C# 中使用 Dapper 读取表的子集【英文标题】:Reading subset of the table using Dapper in C# 【发布时间】:2018-09-11 12:50:22 【问题描述】:

我在项目中使用 Dapper,如果我需要获取单个原始类型(int、decimal、string 等)或任何 db 实体都可以,但我只需要从表中读取 2 列,我在这里遇到了很多挑战:

这是一个简单的查询:

SELECT col1, col2 FROM Table1

我希望收到字符串和整数的地方

这就是我在实现查询后读取数据的方式:

var field1 =  (await result.ReadAsync<string, int>()).FirstOrDefault();

这是不可编译的。 我尝试创建包含 2 个字段的类:string 和 int 并使用该类型而不是 . 所以它导致以下更正:

var field1 =  (await result.ReadAsync<MyData>()).FirstOrDefault();

class MyData

string...

int ...

它可以编译,但我得到字符串的 null 和 int 的正确数据。

查询本身是正确的,我测试过了,没问题。 那么问题是如何阅读这两列?

【问题讨论】:

我认为您想要的原始代码是ReadAsync&lt;Tuple&lt;string, int&gt;&gt;() 【参考方案1】:

您的第二种方法看起来是正确的。 Dapper 默认映射约定。 MyData 类中的属性名称和列名称应该相同,以便 Dapper 可以正确映射。

所以,您的 MyData 类应该如下所示:

class MyData

    string col1...
    int col2...

如果您的属性名称必须不同,您需要修改查询以使用如下所示的列别名:

SELECT col1 AS MyProperty1, col2 AS MyProperty2 FROM Table1

另请注意,在复杂查询/映射的情况下,您的表名应与您的 POCO/Entity 类的名称匹配。

有一些方法可以覆盖默认映射。关于 Dapper 映射的详细讨论请参考this question。

【讨论】:

以上是关于在 C# 中使用 Dapper 读取表的子集的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Dapper 从 SQL Server Image 字段中读取 blob 数据?

使用Dapper读取Oracle多个结果集

C# Dapper基本三层架构使用 (架构关系)

请问 asp.net(c#) 如何读取sqlserver表的字段名及数据类型?

根据 R 中的文件名读取栅格子集

在 Fortran 中读取 HDF5 数据集的子集时出现问题