Подтвердить что ты не робот

Entity Framework, перечисляющая результат SqlQuery

У меня странная ошибка, пока я пытаюсь просмотреть результаты SqlQuery:

var sql = "SELECT @someParam";
var someParamSqlParameter = new SqlParameter("someParam", "Some Value");
var result = _dbContext.SqlQuery<string>(sql, someParamSqlParameter);
var containsAnyElements = result.Any();

Итак, когда отладчик находится в последней строке, и когда я пытаюсь расширить представление результатов result, он показывает мне ожидаемый result("Some Value"), но при вызове последней строки я получил исключение

"SqlParameter уже содержится другим SqlParameterCollection"..

Похоже, когда я пытаюсь открыть Result View для result, он снова вызывает этот запрос. Если это поведение правильное? Если да, объясните, почему это происходит.

4b9b3361

Ответ 1

Похоже, когда я пытаюсь открыть Result View для результата, он снова вызывает этот запрос

Вы совершенно правы - вы видите эффекты Deferred Execution

Database.SqlQuery<T> возвращает IEnumerable<T>, который на самом деле является объектом типа:

System.Data.Entity.Internal.InternalSqlQuery<T>

Итак, ваш объект result - это просто описание запроса, а не результат запроса.

SQL-запрос выполняется только в базе данных при попытке просмотреть результаты запроса.

То, что вы видите, это происходит дважды: один раз, когда ваш код вызывает .Any(), и один раз, когда отладчик перечисляет результирующий набор.


Вы можете исправить это, явно указав EF, когда запускать запрос с помощью .ToList():

var result = _dbContext.SqlQuery<string>(sql, someParamSqlParameter).ToList();

Тип result теперь List<string> и содержит результаты вашего запроса.