繁体   English   中英

嵌套LINQ到实体总和奇怪的结果

[英]Nested linq to entities sum strange result

我需要一个聪明的人,他可以向我解释我的首次查询中出了什么问题;)

最初,我尝试在一个我认为微不足道的查询中执行所有操作( freeArea1 ),但结果却可疑,因此尝试了“强力”调试方法( foreach ),结果得分是正确的。 经过几次尝试,我决定将查询分为两部分( freeArea2freeArea3 ),以期希望得到一些解释。 但是再次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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM