我看到 Linq to Entitites 的行为与我对 Linq 工作原理的理解不一致。请考虑以下代码段:
MWGRCEntities entities = new MWGRCEntities();
foreach (EDMXModel.Classes.RiskScoreMetric rsm in entities.RiskScoreMetrics.Where(rsmq.StatusCode != (int)KnownCodes.RiskScoreMetricStatusInActive))
{
//Magic happens here...
rsm.ImpactOverall = (rsm.ImpactWorkingGroup + rsm.ImpactExecutive) / 2;
rsm.LikelihoodOverall = (rsm.LikelihoodWorkingGroup + rsm.LikelihoodExecutive) / 2;
}
int rank = 0;
double prevScore = -1;
double score = -2;
foreach (EDMXModel.Classes.RiskScoreMetric rsm in entities.RiskScoreMetrics.Where(rsmq.StatusCode != (int)KnownCodes.RiskScoreMetricStatusInActive).OrderByDescending(rsmq => Math.Round((Math.Round(rsmq.ImpactOverall, 3) + Math.Round(rsmq.LikelihoodOverall, 3)), 3)))
{
score = Math.Round((Math.Round(rsm.ImpactOverall, 3) + Math.Round(rsm.LikelihoodOverall, 3)), 3);
if (score != prevScore)
rank++;
rsm.Ranking = rank;
prevScore = score;
}
entities.SaveChanges();
我预计 RiskScoreMetric 对象将在第二个 foreach 循环中使用在第一个 foreach 循环中设置的 ImpactOverall 和 LikelihoodOverall 值进行排序。然而,Linq 似乎在第二个 foreach 循环中根据原始 ImpactOverall 和 LikelihoodOverall 值进行排序(如数据库中的值而不是内存中的值)。我可以通过在第二个 foreach 循环之前立即添加对 entity.SaveChanges() 的第二个调用来轻松修复代码。
谁能告诉我这种行为是否是预期的,如果是,为什么?
谢谢!