MyObject
在p1
类型中有两个名为p2
和int
的属性;现在我希望每个MyObject
获取p1
和{ {1}}并添加它们。我试过这个:
p2
但是说:
无法将
int p1Sum = 0, p2Sum = 0; foreach (int[] ps in new MyEntity().MyObject.Select(o => new { o.p1, o.p2 })) { p1Sum += ps[0]; p2Sum += ps[1]; }
转换为AnonymousType#1
on int[]
。
我该如何解决这个问题?
答案 0 :(得分:2)
foreach (var ps in new MyEntity().MyObject.Select(o => new { o.p1, o.p2 }))
{
p1Sum += ps.p1;
p2Sum += ps.p2;
}
答案 1 :(得分:1)
jyparask的回答肯定会有效,但值得考虑两次使用Sum
- 它将涉及两个数据库调用,但它可能(检查!)避免在本地获取所有单个值:
var entities = new MyEntity().MyObject;
var p1Sum = entities.Sum(x => x.p1);
var p2Sum = entities.Sum(x => x.p2);
现在至少逻辑上存在不一致的可能性 - 某些实体可能会在两个Sum
调用之间被删除或添加。但是,EF可能会确保不会发生(例如通过缓存),或者它可能与您的情况无关。这绝对是你应该考虑的事情。
答案 2 :(得分:1)
除了Jon Skeet和jyparask的回答,您还可以尝试:
var result = (new MyEntity().MyObject
.GroupBy(_=> 0)
.Select(r=> new
{
p1Sum = r.Sum(x=> x.p1)
p2Sum = r.Sum(x=> x.p2)
})
.FirstOrDefault();
以上操作会导致单个查询仅为两列提取Sum
。如果您关注性能,可以查看生成的查询及其执行计划。
if(result != null)
{
Console.WriteLine("p1Sum = " + result.p1Sum);
Console.WriteLine("p2Sum = " + result.p2Sum);
}