Dapper:使用 <T> 执行来自不同资源的多个查询

Posted

技术标签:

【中文标题】Dapper:使用 <T> 执行来自不同资源的多个查询【英文标题】:Dapper: Using <T> to execute multiple queries from different resources 【发布时间】:2021-12-08 14:55:44 【问题描述】:

好的,所以我对如何在标题中措辞有零想法,所以我将在这里解释我想要实现的目标。

我有一个 .cs 文件,其中包含使用下面列出的 dapper 的连接代码。

namespace DBConnector


    public static class Helper
    

        public static string CnnVal(string name)
        
            return ConfigurationManager.ConnectionStrings[name].ConnectionString;
        

    

    public class DataAccess<T>
    
        public List<T> GetInfo(string query, object parameters = null)
        
            using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(Helper.CnnVal("ProxyRPDB")))
            
                return connection.Query<T>(string, object);
            
        
    

我想要实现的是通过上述代码从不同的 .cs 文件执行查询。但!我试图让上面的代码接受来自多个 .cs 文件的查询执行,这些文件都需要来自不同表的不同数据。我一直在努力寻找信息……所以这确实是最后的手段。我正在为 .NET 4.5.2 使用 Dapper。

【问题讨论】:

嗨,有编译器错误吗? 我还没有进入那个阶段,因为我不知道如何完成代码。我目前唯一遇到的错误是在 connection.Query(string, object);声明它们是无效条款。但不知道该放什么。 你的意思是connection.Query&lt;T&gt;(query, parameters); 如果不清楚我要达到的目标(因为我觉得我没有正确解释它)。生病提供一个例子。我有上面的 DataAccess.cs,其中包含我的连接字符串和 connection.Query。我有 2 个其他 .cs 脚本,我希望能够通过此脚本 connection.Query 发送查询,因此我不必经常为其他脚本重写它们。而是选择使用参数(如果你愿意的话)在 Query() 中提供信息,这样我就可以让他们从他们需要的表中获取他们需要的信息。 @TrashaPanda - cs 文件不是脚本。它们是构成系统一部分的编译代码。脚本通常是作用于系统的解释代码。 【参考方案1】:

首先,我们需要修复GetInfo()方法中的基本语法错误:

public static class DataAccess

    public static IEnumerable<T> GetInfo<T>(string query, object parameters = null)
    
        using (var connection = new System.Data.SqlClient.SqlConnection(Helper.CnnVal("ProxyRPDB")))
        
            return connection.Query<T>(query, parameters);
        
    

现在,假设您在其他 *.cs 文件中有正确的引用和使用指令,您可以在这些文件中执行以下操作:

var results = DataAccess.GetInfo<MyTableType>("SELECT * FROM [MyTable]");
foreach(var record in results)

  //...

Dapper 现在将尝试将查询结果映射到 MyTableType 类的实例,因此请确保您已经创建了这样的类。

请注意,这适用于 IEnumerable 而不是 List。如果你真的需要一个 List(提示:你通常不需要,而且 IEnumerable 可以执行得更好)你总是可以在函数调用的末尾加上一个.ToList()

var results = DataAccess.GetInfo<MyTableType>("SELECT * FROM [MyTable]").ToList();

【讨论】:

所以这似乎解决了我的问题。就1个问题。表是否需要存在于我尝试使用“var results = DataAccess.GetInfo("SELECT * FROM [MyTable]");”调用的 .cs 中或者我可以将它们全部存储在一个 .cs 中。 完全忘记更改和修复其他语法错误。所有错误都消失了,一切看起来都正常。 *.cs 文件中不存在表。类定义需要存在于项目中的某个位置,仅此而已。 那么我如何引用位于 内另一个 .cs 中的类定义 要么完全限定类名(包括命名空间),要么在文件顶部为命名空间添加using 指令。

以上是关于Dapper:使用 <T> 执行来自不同资源的多个查询的主要内容,如果未能解决你的问题,请参考以下文章

Dapper 传递动态参数

枚举后Dapper返回结果失败

基于Dapper的泛型Repository

dapper的简单封装

使用基本的Dapper,好用的轻量级Orm框架

DynamicParameters.Output<T> 不会将输出映射到模型