C# Linq从不同的数据表返回求和值
我有以下代码:-C# Linq从不同的数据表返回求和值,c#,linq,datatable,C#,Linq,Datatable,我有以下代码:- var distinctValues = DtSet.Tables["tblData"].AsEnumerable() .Select(row => new { name_1 = "1", name_2 = "I", name_3 =
var distinctValues = DtSet.Tables["tblData"].AsEnumerable()
.Select(row => new
{
name_1 = "1",
name_2 = "I",
name_3 = row.Field<string>("EorD"),
name_4 = row.Field<string>("InvNo")
})
.Distinct();
var distinctValues=DtSet.Tables[“tblData”].AsEnumerable()
.选择(行=>新建)
{
name_1=“1”,
name_2=“I”,
name_3=行字段(“EorD”),
name_4=行字段(“InvNo”)
})
.Distinct();
如果我有另一个数据表(DtSet.Tables[“tblCost”]),有两列,“InvNo”和“Amount”,我如何在我的第一段代码中添加第五列,以返回tblCost上每个InvNo的金额总和?比如:-
var distinctValues = DtSet.Tables["tblData"].AsEnumerable()
.Select(row => new
{
name_1 = "1",
name_2 = "I",
name_3 = row.Field<string>("EorD"),
name_4 = row.Field<string>("InvNo")
name_5 = **Summed total of Amount column on tblCost per InvNo**
})
.Distinct();
var distinctValues=DtSet.Tables[“tblData”].AsEnumerable()
.选择(行=>新建)
{
name_1=“1”,
name_2=“I”,
name_3=行字段(“EorD”),
name_4=行字段(“InvNo”)
name_5=**每个InvNo tblCost上金额列的总和**
})
.Distinct();
在SQL中执行一个查询,将两个表连接起来,并对金额求和
SELECT
D.EorD,
D.InvNo,
SUM(C.Amount) As TotalAmount
FROM
tblData D
LEFT JOIN tblCost C
ON D.InvNo = C.InvNo
GROUP BY
D.EorD, D.InvNo;
我使用了左连接,以防tblCost中没有相应的记录
注意:我不确定列
EorD
。我假设InvNo
在tblData
中是唯一的。否则,如果tblCost
中有相应的列,则应将其包含在联接中,或者从分组依据中删除它,并在其上应用聚合函数,如MAX(D.EorD)AS EorD
您应加入集合,将其分组并聚合:
var tblDataValues = DtSet.Tables["tblData"].AsEnumerable()
.Select(row => new
{
name_1 = "1",
name_2 = "I",
name_3 = row.Field<string>("EorD"),
name_4 = row.Field<string>("InvNo")
})
.Distinct();;
var tblCostValues = DtSet.Tables["tblCost"].AsEnumerable()
.Select(row => new
{
InvNo = row.Field<string>("InvNo"),
Amount = row.Field<int>("Amount"),
}
);
var joinedValue = tblDataValues.Join(tblCostValues, v => v.name_4, c => c.InvNo, (v, c) => new { c, v })
.GroupBy(k => k.v, c => c.c)
.Select(g => new
{
g.Key.name_1,
g.Key.name_2,
g.Key.name_3,
g.Key.name_4,
name_5 = g.Aggregate(0, (s, c) => s + c.Amount)
});
var tblDataValues=DtSet.Tables[“tblData”].AsEnumerable()
.选择(行=>新建)
{
name_1=“1”,
name_2=“I”,
name_3=行字段(“EorD”),
name_4=行字段(“InvNo”)
})
.Distinct();;
var tblCostValues=DtSet.Tables[“tblCost”].AsEnumerable()
.选择(行=>新建)
{
InvNo=行字段(“InvNo”),
金额=行字段(“金额”),
}
);
var joinedValue=tblDataValues.Join(tblCostValues,v=>v.name_4,c=>c.InvNo,(v,c)=>new{c,v})
.GroupBy(k=>k.v,c=>c.c)
.选择(g=>new
{
g、 Key.name_1,
g、 Key.name_2,
g、 Key.name_3,
g、 Key.name_4,
name_5=g.合计(0,(s,c)=>s+c.金额)
});
您可以在一个查询中执行“组加入”:
var distinctValues =
(from data in DtSet.Tables["tblData"].AsEnumerable()
join cost in DtSet.Tables["tblCost"].AsEnumerable().Where(r=>!r.IsNull("Amount"))
on data.Field<string>("InvNo") equals cost.Field<string>("InvNo")
into dc
select new
{
name_1 = "1",
name_2 = "I",
name_3 = data.Field<string>("EorD"),
name_4 = data.Field<string>("InvNo"),
name_5 = dc.Sum(d=>d.Field<int>("Amount"))
})
.Distinct();
var distinctValue=
(来自DtSet.Tables[“tblData”].AsEnumerable()中的数据)
DtSet.Tables[“tblCost”].AsEnumerable()中的联接成本。其中(r=>!r.IsNull(“金额”))
数据字段(“InvNo”)等于成本字段(“InvNo”)
进入dc
选择新的
{
name_1=“1”,
name_2=“I”,
name_3=数据字段(“EorD”),
name_4=数据字段(“InvNo”),
name_5=dc.Sum(d=>d.Field(“金额”))
})
.Distinct();
我已编辑了您的标题。请看,“,其中的共识是“不,他们不应该”。我真的不能把我的头围绕在你们的关系上。似乎您想要计算InvNo集合的总和,但tblData中的一行仅对应于一个发票号。无论哪种方式,您都应该创建一个视图或一个联接查询来将您拥有的两个表联接在一起。一旦有了联接的表或视图,就可以对金额进行求和查询。tblcost具有每个InvNo的多个实例。tblData只有一个。我想要在tblCost上找到的每个对应InvNo的金额总和,以tblData显示。谢谢。我正在努力学习求和的语法。我尝试将sum(c.Field(“Line Value”)作为TotalAmount,但我得到了一个“名称‘sum’在当前上下文中不存在”错误。sum
有一个大写的第一个字母。(c#区分大小写)。我尝试使用它,得到了一个“'AnonymousType#1'不包含'name#1'的定义,并且找不到接受'AnonymousType#1'类型的第一个参数的扩展方法'name#1'(是否缺少using指令或程序集引用?)在底部g.键行的每个f上。这很接近!但是,金额列中有空值,这可能导致“无法将DBNull.Value强制转换为'System.Decimal'。请使用可空类型。我收到了错误。是否有解决方法?难以置信!感谢您的帮助!