c# - Dapper - 将列数未知的结果集映射到具有数组属性的对象

标签 c# sql-server orm dapper

我正在使用 Dapper 将来自 SQL Server 数据库的对象映射到 C# 类。我需要从中提取结果的存储过程之一可以具有可变数量的列,具体取决于上下文。这个结果集总是有一个主键列,然后是 0 到 30 个都是相同数据类型的附加列。

结果集的列基本是这样的:

CustomerID | Email1 | Email2 | Email3 | ...

Email* 列的数量取决于查询中客户存档的最大电子邮件地址数量。

在 C# 中捕获它的自然方法是使用这样的类:

class Customer {
    int ID { get; set; }
    string[] EmailAddresses { get; set; }
}

有没有办法使用 Dapper 将我的结果集映射到这样的对象?

最佳答案

如果您通过 dynamic 做一些魔术,这是可能的。

var user = connection.Query("spGetUser", commandType: CommandType.StoredProcedure)
        .Select(x =>
        {
            var result = new Customer { ID = x.Id };
            foreach (var element in x)
            {
                if (element.Key.Contains("Email"))
                    result.EmailAddresses.Add(element.Value.ToString());
            }
            return result;
        }).FirstOrDefault();

public class Customer
{
    public int ID { get; set; }
    public List<string> EmailAddresses { get; set; } = new List<string>();
}

几个要点:

  • 将数组更改为列表,以便我们可以轻松地向其中动态添加数据。
  • 与直接反序列化为强类型相比,动态对性能的影响总是很小。
  • 这不会检查 Value 属性中保存的数据类型,也不会检查在调用 .ToString() 之前是否确实存在值它。

关于c# - Dapper - 将列数未知的结果集映射到具有数组属性的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38234218/

相关文章:

c# - 无需等待所有任务完成即可访问 Enumerable.Range 中的结果

c# - 如何从组合框中删除更多项目?

.net - SQLParameter如何防止SQL注入(inject)?

java - Hibernate 和 Postgresql 负主键 id 问题

Codeigniter Datamapper ORM php 7 静态问题

c# - 如何在 ASP.NET MVC 中更改菜单标题(垂直到水平)

c# - 使用 LINQ 将嵌套循环展平为一个列表

sql - NULL 有数据类型吗?

sql-server - 使用 PowerShell 将 CSV 文件中的数据导入带有附加列的 SQL Server

python - 简单的 sqlalchemy 过滤器不起作用