嵌套linq到实体总结奇怪的结果

时间:2014-02-09 21:56:47

标签: c# linq entity-framework linq-to-entities

我需要一个聪明的头脑能够解释我的第一次尝试查询出错的原因;)

起初我尝试在一个我认为微不足道的查询中做所有事情( 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;
}

1 个答案:

答案 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)));