Reputation: 751
I need a smart head who can explain me what in my first-try query went wrong ;)
At first I've tried to do all in one query which I considered trivial (freeArea1) but I got suspicious results so I've tried 'brute force' debug approach (foreach) and there the score was right. After few tries I decided to split my query into two (freeArea2 and freeArea3) hoping for some explanation. But again freeArea2 - freeArea3 == dif so both subsums were fine...
So what I'm asking about is why? my first query gives me irrational result.
(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;
}
Upvotes: 0
Views: 136
Reputation: 751
Okay. I think I've found my answer. Like I'd previously suggested in my comment:
if:
cp.AgriculturalParcels.Count() == 0
then probably this:
cp.AgriculturalParcels.Sum(ap => ap.AgriculturalParcelArea)
returns NULL and whole subsum:
.Sum(cp => cp.CadastralParcelArea - cp.AgriculturalParcels.Sum(ap => ap.AgriculturalParcelArea));
seems to be omitted...
SOLUTION:
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)));
Upvotes: 1