gpt4 book ai didi

c# - 合并内存中的两个数据表并将它们分组以获得列的总和。使用 linq 但有点迷失在这里

转载 作者:行者123 更新时间:2023-11-30 16:24:44 24 4
gpt4 key购买 nike

我有两个表,其中两列是固定的。有些列是相同的,有些是新的。列是动态的。

必须在代码级别执行,我正在尝试循环和条件

我想要的是按照条件生成报告,

  • table1 和 table2 中的所有列都必须存在。
  • 如果一个列是常见的并且值在那里,应该将它添加到其他表中的相同行。
  • 如果任何行存在于一个表中但不存在于其他表中,则应包括在内。

示例数据

表1

ID  | NAME | P1  | P2  | P3 
----------------------------
1 | A1 | 1 | 2 | 3.3
2 | A2 | 4.4 | 5 | 6

表 2

  ID  | NAME | P1 | P2  | P4 
---------------------------
1 | A1 | 10 | 11 | 12
2 | A2 | 12 | 14 | 15
3 | A3 | 16 | 17 | 18

预期输出:

 ID  | NAME | P1   |  P2  | P3  | P4
---------------------------------
1 | A1 | 11 | 13 | 3.3 | 12
2 | A2 | 16.4 | 19 | 6 | 15
3 | A3 | 16 | 17 | null| 18

到目前为止的进展:

首先我将这两个表合并到表 1 table1.Merge(table2)

然后尝试对其进行分组

var query = from row in table1.AsEnumerable()
group row by new
{
ID = row.Field<int>("ID"),
Name = row.Field<string>("Name")
}
into grp
select new
{
ID = grp.Key.ID,
Name = grp.Key.Name,
Phase1 = grp.Sum(r => r.Field<decimal>("P1"))
};

我已修改此代码以获取数据表。 请参阅附加的 cs 文件。
这是有效的,但由于列数是动态的,我想我必须对其他列重复它并加入所有这些将添加一列的小表。

如何合并所有这些小表?

我在这里迷路了,还有其他办法吗?感觉很蠢。

如有任何帮助,我们将不胜感激。

附件:


http://dl.dropbox.com/u/26252340/Program.cs

最佳答案

您想使用完全外部联接的实现。类似下面的内容。

一些设置,您可以自己尝试:

DataTable t1 = new DataTable();
t1.Columns.Add("ID", typeof(int));
t1.Columns.Add("Name", typeof(string));
t1.Columns.Add("P1", typeof(double));
t1.Columns.Add("P2", typeof(double));
t1.Columns.Add("P3", typeof(double));

DataRow dr1 = t1.NewRow();
dr1["ID"] = 1;
dr1["Name"] = "A1";
dr1["P1"] = 1;
dr1["P2"] = 2;
dr1["P3"] = 3.3;
t1.Rows.Add(dr1);
DataRow dr2 = t1.NewRow();
dr2["ID"] = 2;
dr2["Name"] = "A2";
dr2["P1"] = 4.4;
dr2["P2"] = 5;
dr2["P3"] = 6;
t1.Rows.Add(dr2);

DataTable t2 = new DataTable();
t2.Columns.Add("ID", typeof(int));
t2.Columns.Add("Name", typeof(string));
t2.Columns.Add("P1", typeof(double));
t2.Columns.Add("P2", typeof(double));
t2.Columns.Add("P4", typeof(double));

DataRow dr3 = t2.NewRow();
dr3["ID"] = 1;
dr3["Name"] = "A1";
dr3["P1"] = 10;
dr3["P2"] = 11;
dr3["P4"] = 12;
t2.Rows.Add(dr3);
DataRow dr4 = t2.NewRow();
dr4["ID"] = 2;
dr4["Name"] = "A2";
dr4["P1"] = 12;
dr4["P2"] = 14;
dr4["P4"] = 15;
t2.Rows.Add(dr4);
DataRow dr5 = t2.NewRow();
dr5["ID"] = 3;
dr5["Name"] = "A3";
dr5["P1"] = 16;
dr5["P2"] = 17;
dr5["P4"] = 18;
t2.Rows.Add(dr5);

查询看起来像:

var ids = (from r1 in t1.AsEnumerable() select new { ID = r1["ID"], Name = r1["Name"] }).Union(
from r2 in t2.AsEnumerable() select new { ID = r2["ID"], Name = r2["Name"] });
var query = from id in ids
join r1 in t1.AsEnumerable() on id equals new { ID = r1["ID"], Name = r1["Name"] } into left
from r1 in left.DefaultIfEmpty()
join r2 in t2.AsEnumerable() on id equals new { ID = r2["ID"], Name = r2["Name"] } into right
from r2 in right.DefaultIfEmpty()
select new
{
ID = (r1 == null) ? r2["ID"] : r1["ID"],
Name = (r1 == null) ? r2["Name"] : r1["Name"],
P1 = (r1 == null) ? r2["P1"] : (r2["P1"] == null) ? r1["P1"] : (double)r1["P1"] + (double)r2["P1"],
P2 = (r1 == null) ? r2["P2"] : (r2["P2"] == null) ? r1["P2"] : (double)r1["P2"] + (double)r2["P2"],
P3 = (r1 == null) ? null : r1["P3"],
P4 = (r2 == null) ? null : r2["P4"]
};

关于c# - 合并内存中的两个数据表并将它们分组以获得列的总和。使用 linq 但有点迷失在这里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10539189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com