[英]Nested linq to entities sum strange result
我需要一个聪明的人,他可以向我解释我的首次查询中出了什么问题;)
最初,我尝试在一个我认为微不足道的查询中执行所有操作( freeArea1 ),但结果却可疑,因此尝试了“强力”调试方法( foreach ),结果得分是正确的。 经过几次尝试,我决定将查询分为两部分( freeArea2和freeArea3 ),以期希望得到一些解释。 但是再次freeArea2-freeArea3 == dif所以两个子集都很好...
所以我要问的是为什么? 我的第一个查询给了我非理性的结果。
(FA1 <0; FA2> FA3)
var user = db.UserSet.First(u => u.Login == HttpContext.User.Identity.Name);
var freeArea1 = db.CadastralParcelSet
.Where(cp => cp.UserId == user.Id)
.Sum(cp => cp.CadastralParcelArea - cp.AgriculturalParcels.Sum(ap => ap.AgriculturalParcelArea));
var freeArea2 = db.CadastralParcelSet
.Where(cp => cp.UserId == user.Id)
.Sum(cp => cp.CadastralParcelArea);
var freeArea3 = db.CadastralParcelSet
.Where(cp => cp.UserId == user.Id)
.Sum(cp => cp.AgriculturalParcels.Sum(ap => ap.AgriculturalParcelArea));
decimal dif = 0;
foreach (var cp in db.CadastralParcelSet.Where(c => c.UserId == user.Id))
{
var carea = cp.CadastralParcelArea;
var aarea = cp.AgriculturalParcels.Sum(a => a.AgriculturalParcelArea);
dif += carea - aarea;
}
好的。 我想我已经找到答案了。 就像我之前在评论中建议的那样:
如果:
cp.AgriculturalParcels.Count() == 0
那么可能是这样的:
cp.AgriculturalParcels.Sum(ap => ap.AgriculturalParcelArea)
返回NULL和整个和:
.Sum(cp => cp.CadastralParcelArea - cp.AgriculturalParcels.Sum(ap => ap.AgriculturalParcelArea));
似乎被省略了...
解决方案 :
var freeArea = db.CadastralParcelSet
.Where(cp => (cp.UserId == user.Id))
.Sum(cp => cp.CadastralParcelArea - (cp.AgriculturalParcels.Count() == 0 ? 0 : cp.AgriculturalParcels.Sum(ap => ap.AgriculturalParcelArea)));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.