谁能建议一种优雅的方法来编写通用C#Dapper过程以返回n个结果集?

用户名

我使用Dapper创建了少量通用过程,以返回列表或任何给定类型的单个项(使用SQL端的SP)以用于DI模型数据服务,例如

public async Task<List<TOut>> GetList<TOut>(string proc, dynamic parameters)
{
    await using var conn = new SqlConnection(connectionString);
    var cmd = parameters == null ? new CommandDefinition(commandText: proc, commandType: CommandType.StoredProcedure) : new CommandDefinition(commandText: proc, commandType: CommandType.StoredProcedure, parameters: parameters);
    return conn.Query<TOut>(cmd).ToList();
}

但是,我一直试图将其扩展为使用QueryMultiple方法在一个查询中返回任意数量的结果集(以提高效率,因为第一个查询非常昂贵,而其他结果集依赖于此)。我想以强类型的结果集(而不是匿名对象)结束,而无需编写大量代码。但是我看不出有任何方法可以提供任意数量的类型参数-到目前为止,我设法做到的最好是为两个结果集生成一个方法,为三个结果集生成一个方法,依此类推:

public async Task<dynamic> Get2Lists<T1, T2>(string proc, dynamic parameters)
{
    await using var conn = new SqlConnection(connectionString);
    var cmd = parameters == null ? new CommandDefinition(commandText: proc, commandType: CommandType.StoredProcedure) : new CommandDefinition(commandText: proc, commandType: CommandType.StoredProcedure, parameters: parameters);
    var result = conn.QueryMultiple(cmd);
    return new
    {
        Table1 = result.Read<T1>(),
        Table2 = result.Read<T2>()
    };
}

public async Task<dynamic> Get3Lists<T1, T2, T3>(string proc, dynamic parameters)
{
    await using var conn = new SqlConnection(connectionString);
    var cmd = parameters == null ? new CommandDefinition(commandText: proc, commandType: CommandType.StoredProcedure) : new CommandDefinition(commandText: proc, commandType: CommandType.StoredProcedure, parameters: parameters);
    var result = conn.QueryMultiple(cmd);
    return new
    {
        Table1 = result.Read<T1>(),
        Table2 = result.Read<T2>(),
        Table3 = result.Read<T3>()
    };
}

在我看来,必须有一种更优雅的方式-有什么建议吗?

凯西·克鲁克斯顿(Casey Crookston)

简短答案:Dapper支持使用SqlMapper.GridReader

这是我们的用法。您应该能够修改它以满足您的需求。我们有一个DapperRepository包含所有通用dapper调用的类。这是一个(大大)简化的版本,向您显示所需的内容。

using Dapper;
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;

public class DapperRepository
{

    private readonly string _connStringName;

    public DapperRepository(string connStringName)
    {
        _connStringName = connStringName;
    }

    private SqlConnection OpenConnection(string cs)
    {
        var connection = ConfigurationManager.ConnectionStrings[cs].ConnectionString;
        SqlConnection con = new SqlConnection(connection);
        con.Open();
        return con;
    }

    // lots of other methods removed for the brevity of this post

    // This is the method you want
    public void QuerySPMultiple(string sql, Action<SqlMapper.GridReader> callback, object parameters = null)
    {
        using (var connection = OpenConnection(_connStringName))
        {
            var gr = connection.QueryMultiple(sql, param: parameters,commandTimeout:0, commandType: CommandType.StoredProcedure);
            callback(gr);
         }
    }
}

假设我们有一个看起来像这样的类:

public class FooBar
{
    public List<Stuff> MyStuff { get; set; }
    public int MyInt { get; set; }
}

然后FooBar使用一个存储的proc调用填充,该调用返回多个数据集:

// Create an instance of the repository
DapperRepository repo = new DapperRepository("your connection string");

// Create your parameters
DynamicParameters param = new DynamicParameters();
param.Add("@Name", "Value");

// Call the stored proc and get back multiple sets of data
FooBar fooBar = new FooBar();
repo.QuerySPMultiple("YourSPName", (reader) =>
{
    fooBar.MyStuff = reader.Read<Stuff>().ToList();
    fooBar.MyInt = reader.Read<int>().FirstOrDefault();
}, parameters: param);

我希望所有这些都是有道理的!如果没有,请随时发布后续问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

编写一种方法来计算前n个奇数的和

来自分类Java

是否有一种优雅的方法来获取Java中多个方法返回的第一个非null值?

来自分类Dev

是否有一种优雅的方法来检查至少一个元素是否具有某个类?

来自分类Dev

寻找一种优雅的方法来同时循环两个不同长度的列表

来自分类Dev

谁能建议一种设置通用退出应用程序快捷方式的方法?

来自分类Dev

用C#的一种优雅方法来分隔以逗号分隔的电子邮件地址列表

来自分类Dev

有没有一种标准的方法来获取C ++中的第n个“ nextafter”浮点值

来自分类Dev

谁能建议一个更快的方法来创建这个数组?

来自分类Java

在使用Guava转换Collection时,是否有一种优雅的方法来删除null?

来自分类Dev

有没有一种优雅的方法来避免 Promise 的代码重复?

来自分类Dev

是否有一种优雅的方法来更改Clojure映射的键?

来自分类Java

一种更优雅的方法来实现基本的Groovy

来自分类Java

有没有一种通用的方法来获取Java中两个列表的交集?

来自分类Dev

有没有一种通用的方法来更新Laravel中的两个联接表?

来自分类Dev

一种优雅的方法来计算一个文件中的模式在另一个文件中出现了多少次

来自分类Dev

有没有一种混乱的方法来链接返回Option值的函数的结果?

来自分类Dev

谁能建议一种创建此数组的更快方法?

来自分类Dev

我想找到一种方法来在1个mysql查询中获得合适的结果

来自分类Dev

有没有一种优雅的方法来检查数组中的哪些元素在另一个容器中?

来自分类Dev

同一个类中的同名函数 - 有没有一种优雅的方法来确定调用哪个?

来自分类Dev

编写一个 C# 方法来从表中返回值

来自分类Dev

是否有一种简单的方法来获取所有通用模块扩展?

来自分类Dev

有没有一种通用的方法来指定jquery中的元素

来自分类Java

有没有一种优雅的方法来解开包裹在2个嵌套Optional中的对象?

来自分类Dev

我如何编写一种方法来检查字符是否与参数匹配?

来自分类Java

我如何编写一种方法来成对切换值的顺序

来自分类Dev

如何使用Badlogic框架编写一种方法来遍历要打印的数字?

来自分类Dev

您能建议一种更蟒蛇的方法来查找和返回具有特定属性值的列表元素吗?

来自分类Dev

是否有一种简洁的方法来指定两个单独的第n个孩子?

Related 相关文章

  1. 1

    编写一种方法来计算前n个奇数的和

  2. 2

    是否有一种优雅的方法来获取Java中多个方法返回的第一个非null值?

  3. 3

    是否有一种优雅的方法来检查至少一个元素是否具有某个类?

  4. 4

    寻找一种优雅的方法来同时循环两个不同长度的列表

  5. 5

    谁能建议一种设置通用退出应用程序快捷方式的方法?

  6. 6

    用C#的一种优雅方法来分隔以逗号分隔的电子邮件地址列表

  7. 7

    有没有一种标准的方法来获取C ++中的第n个“ nextafter”浮点值

  8. 8

    谁能建议一个更快的方法来创建这个数组?

  9. 9

    在使用Guava转换Collection时,是否有一种优雅的方法来删除null?

  10. 10

    有没有一种优雅的方法来避免 Promise 的代码重复?

  11. 11

    是否有一种优雅的方法来更改Clojure映射的键?

  12. 12

    一种更优雅的方法来实现基本的Groovy

  13. 13

    有没有一种通用的方法来获取Java中两个列表的交集?

  14. 14

    有没有一种通用的方法来更新Laravel中的两个联接表?

  15. 15

    一种优雅的方法来计算一个文件中的模式在另一个文件中出现了多少次

  16. 16

    有没有一种混乱的方法来链接返回Option值的函数的结果?

  17. 17

    谁能建议一种创建此数组的更快方法?

  18. 18

    我想找到一种方法来在1个mysql查询中获得合适的结果

  19. 19

    有没有一种优雅的方法来检查数组中的哪些元素在另一个容器中?

  20. 20

    同一个类中的同名函数 - 有没有一种优雅的方法来确定调用哪个?

  21. 21

    编写一个 C# 方法来从表中返回值

  22. 22

    是否有一种简单的方法来获取所有通用模块扩展?

  23. 23

    有没有一种通用的方法来指定jquery中的元素

  24. 24

    有没有一种优雅的方法来解开包裹在2个嵌套Optional中的对象?

  25. 25

    我如何编写一种方法来检查字符是否与参数匹配?

  26. 26

    我如何编写一种方法来成对切换值的顺序

  27. 27

    如何使用Badlogic框架编写一种方法来遍历要打印的数字?

  28. 28

    您能建议一种更蟒蛇的方法来查找和返回具有特定属性值的列表元素吗?

  29. 29

    是否有一种简洁的方法来指定两个单独的第n个孩子?

热门标签

归档