c# - 使用 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> partneri
5k 行。对于我运行的每一个,它都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
(我从中填充列表partneri
)SELECT 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 |
解决方案
您可以用一个查询替换所有逻辑,该查询执行以下操作:
select d.ppid, max(d.datum)
from partner p
inner join dokument d
on d.ppid = p.ppid
group by d.ppid
您可能需要添加where
带有附加条件的 - 子句来选择您想要的合作伙伴。
推荐阅读
- apache-spark - 是否可以在不停止 SparkContext 的情况下刷新和上传 Spark 事件日志?
- google-apps-script - GoogleJsonResponseException:对 drive.files.insert 的 API 调用失败并出现错误:错误请求
- java - 异常 NoClassDefFoundError: org/jsoup/Jsoup
- python - 从python列表项中提取文本
- android - 我无法在 android studio 上的 android 应用程序上更改文本
- python - reticulate 在 Linux 上找不到 conda env
- swift - Swift:Jazzy 无法运行 xcodebuild
- docker - Matlab 代码生成问题和 WIN10 和 WIN2016 服务器 Docker 容器上的进程之间的差异
- javascript - 如何过滤与 URL 参数相同的 id?
- python - 如何从 AWS-chalice 应用程序生成可执行文件?