我编写了一个测试用例:
我有一张这样的表
Id|IdA|IdW|Quantity
1 1 3 5
2 1 4 2
3 2 5 3
Id
是主键,IdA
是文章ID,IdW
是框ID,数量是文章数量。
现在我必须按IdA
对数量进行分组,所以我正在做:
var groups =
models
.GroupBy(x => new { x.IdA })
.Select
(
x =>
new Model
{
Id = (x.Select(y => y.Id).Count() > 1) ? 0 : x.Select(y => y.Id).First(),
IdA = x.Key.IdA,
Qty = x.Sum(y => y.Qty)
}
);
此处models
是上表。它工作正常,我还设法在没有分组时保留主键(只有一个IdA
)
现在我想要这样做:我想保留IdW
以保留尚未归类的内容。理想的结果是:
Id|IdA|IdW|Quantity
0 1 0 7
3 2 5 3
我尝试对组进行foreach,使用主键检索行,然后将IdW
设置为组,如下所示:
foreach(var e in groups)
{
var nonGroupedRow = models.Where(x => e.Id != 0 && x.Id == e.Id).FirstOrDefault();
var targetModel = groups.FirstOrDefault(x => x.Id == e.Id);
if(nonGroupedRow != null && targetModel != null)
{
targetModel.IdW = nonGroupedRow.IdW;
}
}
这令人难以置信的不起作用。两个小组仍然有IdW = 0
。我还做了另一项测试,确保做到:
void Main()
{
var a = new List<A> { new A { Id = 1 }, new A { Id = 2 } };
a.FirstOrDefault(x => x.Id == 1).Id = 2;
// both have Id = 2
}
class A
{
public long Id {get;set;}
}
它只需要在我的头脑中工作,也给出了上面的例子,但事实并非如此。我哪里错了?
答案 0 :(得分:0)
首先,您的计数是计算在组中找到的条目数量,因此您无需指定它来计算ID,它将是相同的
其次要检索第一个ID,从分组数据中获取第一个条目,然后从那里获取id属性
你基本上有答案
var groups =
models
.GroupBy(x => new { x.IdA })
.Select
(
x =>
new Model
{
Id = (x.Count() > 1) ? 0 : x.First().Id,
IdA = x.Key.IdA,
IdW = (x.Count() > 1) ? 0 : x.First().IdW,
Qty = x.Sum(y => y.Qty)
}
);