Вопрос по c#, entity-framework-4.3, enumeration – Entity Framework перечисляет результат SqlQuery

17

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

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

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

Msgstr "SqlParameter уже содержится в другой SqlParameterCollection."

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

Ваш Ответ

1   ответ
35

когда я пытаюсь открыть Result View of result, он снова вызывает этот запрос

Вы совершенно правы - вы видите последствия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> и он содержит результаты вашего запроса.

Отличный друг. Я сходил с ума, и все остальные ответы на ту же тему не помогли. alessalessio
Отличное объяснение. Большое спасибо за быстрый и четкий ответ. Vladimirs
Серьезно ... Я просто потратил 6 часов ... и ответ: .ToList () ?? Замечательный! Frederik Moller
Я не могу понять, как из-за этой проблемы появилось сообщение об ошибке. Jonathan Wood

Похожие вопросы