我正在使用以下 SQL 來計算weight視圖中命名的列的值。我需要將此計算邏輯移動到代碼中。
CASE
WHEN SUM(BaseVal) OVER (PARTITION BY TEMPS.MandateCode) = 0 THEN 0
ELSE (BaseVal / (SUM(BaseVal) OVER (PARTITION BY TEMPS.MandateCode))) END AS [Weight]
是否迭代每個并按MandateCode 一個好主意分組
var datatableenum = datatable.AsEnumerable();
foreach(var item in datatableenum)
{
List<DataTable> result = datatable.AsEnumerable()
.GroupBy(row => row.Field<int>("MandateCode"))
.Select(g => g.CopyToDataTable())
.ToList();
}
uj5u.com熱心網友回復:
我要說“不”,因為正如您所擁有的那樣,它將為每個任務代碼執行組操作,為每一行然后復制然后到串列,這加起來會消耗大量資源..我會做首先是一個manmissioncode=>sum的字典,然后在迭代表時使用它
var d = datatable.AsEnumerable()
.GroupBy(
row => row.Field<int>("MandateCode"),
row => row.Field<double>("BaseVal")
).ToDictionary(g => g.Key, g => g.Sum());
注意我不知道 BaseVal 是什么型別;你需要調整這個。如果它是一個整數,請記住您將對small_int/big_integ進行計算12/6152,該計算始終為 0,因此將其中一個運算元強制轉換為 double,因此結果將類似于 0.1234
然后在每一行上使用字典
foreach(var item in datatableenum)
{
int sumbv = d[item.Field<int>("MandateCode"));
item["Weight"] = sumbv == 0 ? 0 : item.Field<double>("BaseVal") / sumbv;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/322836.html
標籤:C# sql sql-server 林克
