Я вижу поведение Linq для Entitites, которое не соответствует моему пониманию того, как работает Linq. Пожалуйста, обратите внимание на следующий фрагмент кода:Использование Linq для объектов с OrderByDescending и SaveChanges
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 объекты будут отсортированы во втором цикле Еогеасп с использованием значений ImpactOverall и LikelihoodOverall, установленные в первом цикле Еогеасп. Однако представляется, что Linq сортирует во втором цикле foreach на основе исходных значений ImpactOverall и LikelihoodOverall (как и в значениях в базе данных, а не в памяти). Я могу легко исправить код, просто добавив второй вызов сущностям .SaveChanges() непосредственно перед вторым циклом foreach.
Может ли кто-нибудь сказать мне, если это поведение ожидается, и если да, то почему?
Спасибо!
Удивительный отклик. Большое спасибо. Я заметил, что некоторые методы не могут быть использованы в этих выражениях и не знают, почему. Теперь я понимаю, что происходит намного больше. Означает ли это, что если я вставляю объект в контекст, то попытайтесь найти его с помощью запроса select linq, который я не найду, потому что он не был вставлен в базу данных? – AEberhard
@AEberhard: Да, точно.Исключением, которое вы видели, вероятно, является позорным исключение «не могу перевести в хранилище», и это один из наиболее часто задаваемых вопросов, что это значит. Я считаю, что люди путаются в этом вопросе - это термин «выражение хранилища», которое в 99% всех случаев означает «SQL». Я думаю, что они используют более абстрактный термин, потому что EF не требует перевода в SQL. Если бы существовала компания со специальной системой БД и фирменным языком запросов, называемым «Babble», они могли бы написать провайдер LINQ to Entities для Babble. Тогда выражение «store» будет «Babble». – Slauma