2013-04-02 9 views
17

Mam dziwny błąd podczas próbuję zobaczyć wyniki sqlquery:Entity Framework wyliczanie sqlquery wynik

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

Więc kiedy debugger jest w ostatnim wierszu i gdy próbuję rozwinąć rezultaty Widok wyniku to pokazuje mnie oczekuje result("Some Value") ale powołując się na ostatnią linię mam wyjątek

„The SqlParameter jest już zawarta przez innego SqlParameterCollection.”.

Wygląda na to, kiedy próbuję otworzyć Wynik View of wyniku ponownie wywołuje to zapytanie. Jeśli to zachowanie jest poprawne? Jeśli tak, proszę wyjaśnić, dlaczego tak się dzieje.

Odpowiedz

35

Wygląda na to, kiedy próbuję otworzyć Wynik Widok efekcie wywołuje to zapytanie ponownie

masz rację - widzisz efekty Deferred Execution

Database.SqlQuery<T> zwraca IEnumerable<T> który jest rzeczywiście obiekt typu:

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

Więc result obiekt jest w rzeczywistości tylko opisem zapytania - nie wynikami zapytania.

Zapytanie SQL jest wykonywane tylko w bazie danych podczas próby wyświetlenia wyników zapytania.

Co widzisz jest to dzieje się dwa razy: raz, gdy kod wywołuje .Any(), a raz, kiedy debugger wylicza zestaw wyników.


Można rozwiązać ten problem poprzez wyraźne mówienie EF kiedy uruchomić kwerendę z .ToList():

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

Rodzaj result jest teraz List<string> i zawiera wyniki zapytania.

+0

Świetne wyjaśnienie. Dziękuję bardzo za tak szybką i jasną odpowiedź. – Vladimirs

+0

Świetny kumpel. Szaleję, a wszystkie inne odpowiedzi z tego samego tematu nie były pomocne. – alessalessio

+2

Nie mogę do końca życia dowiedzieć się, w jaki sposób ten problem spowodował zgłoszenie komunikatu o błędzie. –