首页 > 解决方案 > 使用 foreach 构建 SQL

问题描述

我有这个代码:

private void button1_Click(object sender, EventArgs e)
{
    foreach(Int_String partner in partneri)
    {
        double danaBezProdaje = (DateTime.Today - Komercijalno.Partner.PoslednjaKupovina(partner._int)).TotalDays;
        if (danaBezProdaje > 31 && danaBezProdaje < 1100)
        {
            NeaktivniPartner np = new NeaktivniPartner();
            np.ppid = partner._int;
            np.naziv = partner._string;
            np.danaBezKupovine = danaBezProdaje;
            neaktivniPartneri.Add(np);
        }
    }
    dataGridView1.DataSource = M.List.ConvertToDataTable(neaktivniPartneri);
}

所以在这里我有List<Int_String> partneri5k 行。对于我运行的每一个,它都Komercijalno.Partner.PoslednjaKupovina(partner._int)包含如下所示的 SQL 语句:

public static DateTime PoslednjaKupovina(int ppid)        
{
    using (FbConnection con = new FbConnection(M.Baza.connectionKomercijalno2018))
    {
        con.Open();
        using (FbCommand cmd = new FbCommand("SELECT DATUM FROM DOKUMENT WHERE PPID = @PPID ORDER BY DATUM DESC", con))
        {
            cmd.Parameters.AddWithValue("@PPID", ppid);

            FbDataReader dr = cmd.ExecuteReader();

            if (dr.Read())
                return Convert.ToDateTime(dr[0]);
            else
                return new DateTime(1, 1, 1);
        }
    }
}

所以 SQL 语句执行了 5k 次,这太慢了。

那么我如何将我的List<Int_String>或只是整数数组传递给 sql 命令,以便我执行一次(在 foreach 或其他方法中)并返回dataAdapter,所以我只执行一次 SQL。

返回的 DataAdapter 应如下所示:

| ppid     | datum    |

因此,假设我有包含以下数据的表PARTNER(我从中填充列表partneriSELECT PPID, NAZIV FROM PARTNER

| PPID    | NAZIV    |
| 1       | name001  |
| 2       | name002  |
| 3       | name003  |
| 4       | name004  |

假设我的 DOKUMENT 表有以下数据:

| ID      | PPID    | DATE       |
| 1       | 2       | 12.03.2018 |
| 2       | 3       | 12.03.2018 |
| 3       | 2       | 05.03.2018 |
| 4       | 2       | 03.04.2018 |
| 5       | 1       | 26.03.2018 |
| 6       | 4       | 21.02.2018 |
| 7       | 4       | 06.05.2018 |

我想要的输出是:

| PPID    | DATE       |
| 1       | 26.03.2018 |
| 2       | 03.04.2018 |
| 3       | 12.03.2018 |
| 4       | 06.05.2018 |

标签: c#sqlwinformsfirebird

解决方案


您可以用一个查询替换所有逻辑,该查询执行以下操作:

select d.ppid, max(d.datum)
from partner p
inner join dokument d
    on d.ppid = p.ppid
group by d.ppid

您可能需要添加where带有附加条件的 - 子句来选择您想要的合作伙伴。


推荐阅读