【问题标题】:executing and returning two queries at same time同时执行并返回两个查询
【发布时间】:2022-01-22 14:36:57
【问题描述】:

我想显示这样的数据:image

我正在使用 home 控制器从 postgres 表中获取详细信息,如下所示:

        public IActionResult AllTransactionsList(DateTime startDate, DateTime endDate)
    {
        var dataset = new DataSet();
        using var connection = new NpgsqlConnection(connString);
        connection.Open();
        Console.WriteLine(startDate);
        var query = String.Format(@"SELECT accounts.account,accounts.type,DATE(transactions.date),transactions.transactionid,transactions.amount,transactions.note FROM transactions FULL JOIN accounts ON transactions.accountid=accounts.accountid WHERE transactions.date BETWEEN '{0}' AND '{1}' ORDER BY transactions.date;", startDate, endDate);


        string mainQuery = String.Format(@"SELECT sum(amount) FROM transactions INNER JOIN accounts ON transactions.accountid=accounts.accountid WHERE accounts.type='income' AND transactions.date BETWEEN '{0}' AND '{1}'", startDate,endDate);
        using var mainCommand = new NpgsqlCommand(query, connection);
        decimal mainResult = mainCommand.ExecuteNonQuery();

        using (var command = new NpgsqlCommand(query, connection))
        {

            var adapter = new NpgsqlDataAdapter(command);
            adapter.Fill(dataset);
        }

        return View(dataset);

    }

但我还需要显示底部的收入/支出image

如何同时从两个查询中获取数据并放入数据集中?

即,我有两个查询(查询,mainResult)。我将从 query 获取行,我将从 ma​​in result 获取十进制值我需要在视图中返回它们。

我怎样才能做到这一点?谁能帮帮我?

【问题讨论】:

  • 有需要的可以再发个帖子,里面有数据库表设计结构,带postgres或者sql标签,以后会有更多人帮你解决问题。
  • 在第一个查询中执行 FULL JOIN 没有意义:您在 WHERE 中指定交易列,将其转换为左连接,并假设您不能在没有帐户的情况下进行交易记录,左连接转换为内连接

标签: c# postgresql asp.net-core-mvc dataset


【解决方案1】:

方法一。

可以将两条sql语句拼接成一句话。

方法二。

创建一个新的dataset。得到mainQueryDataSetqueryDataSet后,就可以组合起来了。

【讨论】:

    【解决方案2】:

    在这种特殊情况下,您可以进行第一个查询

    SELECT 
      a.account,
      a.type,
      DATE(t.date),
      t.transactionid,
      t.amount,
      t.note,
      SUM(CASE WHEN a.type = 'income' THEN t.amount END) OVER(PARTITION BY a.account) as sumtrans
    FROM 
      transactions t 
      INNER JOIN accounts ON t.accountid=a.accountid 
    WHERE 
      t.date BETWEEN @f AND @t
    ORDER BY t.date
    

    您需要让命令知道参数:

    adapter.SelectCommand.Parameters.AddWithValue("f", startDate);
    adapter.SelectCommand.Parameters.AddWithValue("t", endDate);
    

    有关将日期时间传递给 pg 的更多信息,请参见此处: https://www.npgsql.org/doc/basic-usage.html

    永远不要以您已经这样做的方式将数据传递到数据库。每个 SQL 都是一个可以编译和运行的小程序。通过将用户提供的数据连接到 SQL 字符串中,您可以让最终用户能够插入自己的 SQL;您基本上是在让他们访问数据库。是的,当它是一个日期时间变量时,很难破解一个数据库,但是如果你以这种方式对日期进行破解,我相信你会为字符串这样做,然后你盯着http://Bobby-tables.com 的桶枪。即使您认为它安全,将日期作为字符串传递给数据库也是有问题的,因为它们必须被解析回一个日期,这意味着 C# 和 PG 必须在格式上对齐。假设 C# 字符串将日期作为“09/10 /11" - 2011 年 9 月 10 日是几号? 2011 年 9 月 10 日? 2011 年 10 月 9 日? 2009 年 10 月 11 日? 1909 年?

    C# 有专用的 DateTime 数据类型,PG 有专用的 DateTime 数据类型,并且有一种从 c# 到 pg 的传输机制,它不会通过格式化的字符串跳闸;将您的数据保留为日期

    【讨论】:

      猜你喜欢
      • 2016-03-17
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多