我需要一个聪明的头脑能够解释我的第一次尝试查询出错的原因;)
起初我尝试在一个我认为微不足道的查询中做所有事情( 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;
}
答案 0 :(得分:1)
好。我想我找到了答案。就像我之前在评论中提到的那样:
如果:
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)));