【发布时间】:2022-01-04 17:24:40
【问题描述】:
我有这样的 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 方法中获取Result 的0th 元素并将其分成列,添加到数据表,添加新元素(第一个元素)并填充它(请参阅该方法中的注释)但我被卡住了,不知道该怎么做。谁有解决办法?
编辑:我说不清楚,所以这里有更多解释。
我有 foreach 循环,它循环通过 5 databases 并且在 foreach 循环内是这段代码。
第一个数据库返回这些列
MagacinID
RobaID
God2021
第二
MagacinID
RobaID
God2020
第三
MagacinID
RobaID
God2019
第四
MagacinID
RobaID
God2018
第五
MagacinID
RobaID
God2017
我希望将所有这些合并到一个数据表中的列MagacinID AND RobaID 上,如下所示:
MagacinID
RobaID
God2021
God2020
God2019
God2018
God2017
【问题讨论】:
-
我认为您的问题不完整。在与您的问题无关的想法中,我个人不会为此使用 linQ,我将尝试在 DB 层解决此类问题。
-
@LeandroBardelli 问题是我正在更改连接字符串(不同的数据库),所以我不能在 DB 层上这样做
-
你可以做数据库链接。但我认为你必须编辑你的问题,因为以“像这样:”结束,仅此而已
-
@LeandroBardelli 抱歉,已更正.. 只是说明而已。
-
我很困惑 - 您正在从查询中填充数据表,然后将其投影到匿名类型,只是想将它放回作为数据表?