2015-03-10 7 views
7

Mam problem z wolnymi uruchomieniami zapytań, które widzimy tylko w produkcji, i widzę słabo działający SQL w profilerze, jednak Nie wiem, jak mogę tego użyć, aby prześledzić z powrotem do kodu, który wygenerował oświadczenie w pierwszej kolejności, lub jeśli śledzenie z powrotem do kwerendy EF jest możliwe. Czy EF ma jakąkolwiek możliwość zidentyfikowania pochodzenia instrukcji SQL, aby pomóc w odnalezieniu problemu w kodzie?Jak mogę prześledzić zapytanie SQL wygenerowane przez EF z powrotem do kodu, który je utworzył

wierzę, to problem może być związany z załadunkiem kod załadunku pesymistycznie, czyli jego załadunku ustawić całe wyniki, a następnie filtrowanie listy w kodzie zamiast filtrując go w SQL

+0

Czy rozważałeś zakup http://www.hibernatingrhinos.com/products/efprof? Przeczytaj http://ayende.com/blog/169155/nhibernate-entity-framework-profiler-3-0 –

+0

Jaką wersję EF? – xanatos

+3

w ramach encji 6, powinieneś być w stanie [zalogować go] (https://msdn.microsoft.com/en-us/data/dn469464.aspx). Ale prostszym sposobem (którego używam) jest właśnie umieszczenie punktów przerwania dla zapytań, które są najbardziej podejrzane. Powinieneś wiedzieć, które tabele są odwzorowane na który obiekt, prawda? – Default

Odpowiedz

1

można wykonać następujące czynności, w twoim repozytorium lub DataContext (wspólne miejsce wykonywania zapytań) do debugowania zapisu każdego zapytania.

var data= from item in entity 
       where item.id = 564564 
       select item;  
Debug.WriteLine(((System.Data.Objects.ObjectQuery)data).ToTraceString()); 

Możesz napisać następujący kod, aby powiedzieć, jaki jest stos wywoławczy po wykonaniu powyższego zapytania. Następnie znajdź zapytanie, którego szukasz, a stos wywołań powie Ci, gdzie zostało wykonane zapytanie.

StackTrace stackTrace = new StackTrace();   // get call stack 
StackFrame[] stackFrames = stackTrace.GetFrames(); 

Możesz użyć śledzenia microsoft lub log4net, aby zarejestrować te rzeczy, a następnie łatwo znaleźć zapytanie.

+1

Myślę, że oznacza on uczynienie wynikowego zapytania SQL identyfikowalnym z oryginalnym kodem EF/C#. –

+0

dobrze Myślałem, że może śledzić te zapytania, a następnie dopasować je do zapytania profilu. Będę edytować ... –

0

Można utworzyć inną jednostkę w bazie danych (np. DebugEntity) i uruchomić zapytanie na niej tuż przed/po faktycznych zapytaniach.

ctx.DebugEntity.Where(x => x.ID == "myId1"); //myId2, myId3, myId4, whatever helps you locate the LINQ query from the profiler... 

Powinno to pojawić się w programie profilującym SQL.

Powiązane problemy