【问题标题】:Query using Dapper in C# & MySQL在 C# 和 MySQL 中使用 Dapper 进行查询
【发布时间】:2020-07-25 00:43:03
【问题描述】:

我是 C# 新手,我正在制作一个小软件来练习。

我已经构建了一个查询来获取最后一个 Dispatch_ID 编号(这不是自动增量)。我使用的代码是这样的:

public string GetLastDispatchNum()
    {
        using (IDbConnection connection = new MySql.Data.MySqlClient.MySqlConnection(Helper.CnnVal("FineCreteDB")))
        {
            var output=connection.Query("SELECT `Dispatch_ID` FROM `DispatchData` ORDER BY `Dispatch_ID` DESC LIMIT 1").Select(x=>x.Dispatch_ID).ElementAt(0);
            return output;
        }
    }

虽然这确实完成了我的工作,但我觉得我在这里没有正确使用 dapper,这可以更整洁。查询“SELECT Dispatch_ID FROM DispatchData ORDER BY Dispatch_ID DESC LIMIT 1”本身只返回一个值和一列。因此使用 .Select(x=>x.Dispatch_ID) & .ElementAt(0) 似乎有点重复。

有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: c# mysql winforms dapper


    【解决方案1】:

    我不知道它是否与其他答案相比增加了很多,但我更喜欢 QuerySingle 在我期望单个值的情况下。如果结果集中不完全是一项,则会引发异常。

    public int GetLastDispatchNum()
    {
        using (IDbConnection connection = new MySql.Data.MySqlClient.MySqlConnection(Helper.CnnVal("FineCreteDB")))
        {
            int output=connection.QuerySingle<int>("SELECT `Dispatch_ID` FROM `DispatchData` ORDER BY `Dispatch_ID` DESC LIMIT 1").Select(x=>x.Dispatch_ID).ElementAt(0);
            return output;
        }
    }
    

    它确保了两件事:

    • 默认值(可能为 null)不会在后期造成问题。
    • 我的数据库或我的数据库模型中的不一致不会被忽视。

    【讨论】:

      【解决方案2】:

      就我个人而言,我会改用这个:

      var output=connection.Query<int>("SELECT `Dispatch_ID` FROM `DispatchData` ORDER BY `Dispatch_ID` DESC LIMIT 1").FirstOrDefault();
      

      不能说它在技术上更好/更快,但对我来说似乎更干净。

      【讨论】:

      • 谢谢。我知道它可能不是更快或更好,但我只是不想养成“错误”编程的习惯。
      【解决方案3】:

      要更新 Dapper 查询以便不必使用 .ElementAt(0),您可以简单地写出 Dapper 代码,如下所示:

      // Assuming that Dispatch_ID is an int
      var output = connection.QueryFirst<int>("SELECT `Dispatch_ID` FROM `DispatchData` ORDER BY `Dispatch_ID` DESC LIMIT 1");
      

      此外,如果您想在 Dapper 函数中使用泛型,我建议您使用与您正在检索的内容相匹配的东西,因此我将其从 &lt;DispatchData&gt; 更改为 &lt;int&gt;

      【讨论】:

      • 谢谢,这样干净多了。并为我澄清了一些关于 dapper 的事情。
      • 当您只查询单个标量值(结果集第一行的第一列)时,也可以使用ExecuteScalar&lt;int&gt;
      猜你喜欢
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多