我有這樣的 SQL 查詢(一旦我完成這項作業就會被引數化):
using (FbCommand cmd = new FbCommand("SELECT MAGACINID, ROBAID, SUM(KOLICINA) AS GOD" godina.ToString() " FROM STAVKA WHERE VRDOK = 13 OR VRDOK = 15 GROUP BY MAGACINID, ROBAID ORDER BY ROBAID", con))
{
using (FbDataAdapter da = new FbDataAdapter(cmd))
{
DataTable tempDT = new DataTable();
if (dt.Rows.Count == 0)
{
da.Fill(dt);
continue;
}
da.Fill(tempDT);
var result = dt.AsEnumerable()
.Join(tempDT.AsEnumerable(),
x => new { field1 = x["MAGACINID"], field2 = x["ROBAID"] },
y => new { field1 = y["MAGACINID"], field2 = y["ROBAID"] },
(x, y) => new {
x,
addYear = y["GOD" godina.ToString()]
});
dt = LINQResultToDataTable(result);
}
}
這是LINQResultToDataTable()方法
private DataTable LINQResultToDataTable<T>(IEnumerable<T> Linqlist)
{
DataTable dt = new DataTable();
PropertyInfo[] allColumns = null;
if (Linqlist == null) return dt;
foreach (T Record in Linqlist)
{
if (allColumns == null)
{
allColumns = ((Type)Record.GetType()).GetProperties();
// Record at position 0 is whole object and needs to be broke into pieces
// Record at position 1 is new column
foreach (PropertyInfo GetProperty in allColumns)
{
Type colType = GetProperty.PropertyType;
if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition()
== typeof(Nullable<>)))
{
colType = colType.GetGenericArguments()[0];
}
dt.Columns.Add(new DataColumn(GetProperty.Name, colType));
}
}
DataRow dr = dt.NewRow();
foreach (PropertyInfo pinfo in allColumns)
{
dr[pinfo.Name] = pinfo.GetValue(Record, null) == null ? DBNull.Value : pinfo.GetValue
(Record, null);
}
dt.Rows.Add(dr);
}
return dt;
}
第一個資料表填充沒問題,它用這些列填充它:
MagacinID
RobaID
God2021
現在,當我嘗試使用 linq 加入新表時,我應該只添加God2020為新列。問題是,當我創建 linq 的輸出時,我不能告訴它把x物件分成幾列,但我需要把它整個拿起來,所以 linq 結果看起來像這樣:
x (this one have ItemArray with all columns)
God2020
和新的資料表看起來一樣。
我嘗試做的是在LINQResultToDataTable方法內部獲取0th元素Result并將其分成列,添加到資料表,添加新元素(第一個元素)并填充它(請參閱該方法中的評論)但我被卡住了,不知道該怎么做. 有人有任何解決方案嗎?
編輯:我說得不清楚,所以這里有更多解釋。
I have foreach loop which loops through 5 databases and inside that foreach loop is this code.
First database returns these columns
MagacinID
RobaID
God2021
Second
MagacinID
RobaID
God2020
Third
MagacinID
RobaID
God2019
Fourth
MagacinID
RobaID
God2018
Fifth
MagacinID
RobaID
God2017
I want all this merged into one datatable on columns MagacinID AND RobaID like this:
MagacinID
RobaID
God2021
God2020
God2019
God2018
God2017
uj5u.com熱心網友回復:
通過合并,我的意思是使用 DataTable 合并,它基本上對資料表中宣告的 PK 欄位執行完全外部聯接,然后將合并到表中的結果作為聯接的結果;
var d1 = new DataTable();
d1.Columns.Add("SomeId");
d1.Columns.Add("Col1");
d1.Rows.Add("ID1", "Col1Val1");
d1.Rows.Add("ID2", "Col1Val2");
d1.PrimaryKey = new[] { d1.Columns["SomeId"] };
var d2 = new DataTable();
d2.Columns.Add("SomeId");
d2.Columns.Add("Col2");
d2.Rows.Add("ID1", "Col2Val1");
d2.Rows.Add("ID3", "Col2Val2");
d2.PrimaryKey = new[] { d2.Columns["SomeId"] };
var d3 = new DataTable();
d3.Columns.Add("SomeId");
d3.Columns.Add("Col3");
d3.Rows.Add("ID2", "Col3Val1");
d3.Rows.Add("ID3", "Col3Val2");
d3.PrimaryKey = new[] { d3.Columns["SomeId"] };
d1.Merge(d2, false, MissingSchemaAction.Add);
d1.Merge(d3, false, MissingSchemaAction.Add);
以下是上述代碼的結果:

d1 以兩列開始,然后在第一次合并期間添加了第三列 (Col2),并將 d2 的 Col2 中的值放入 d1 的 Col2,匹配 PK 列 (SomeId)。
然后在第二次合并期間,將第四列添加到 d1 (Col3),并將 d3 中 Col3 中的值復制到 d1 中。
您會注意到我故意將d2不同的 PK 值設定為d1,因此不僅添加了新列,而且還添加了新行
第二個合并操作沒有添加新行(d1 已經有一個 ID1、ID2 和 ID3)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/367378.html
