2009-10-26 9 views
5

Podczas poszukiwania LINQ warunkowy gdzie klauzula, znalazłem this article, sposób ich wykorzystania jest jak poniżej:LINQ Warunkowe Where

var logs = from log in context.Logs 
      select log; 

if (filterBySeverity) 
    logs = logs.Where(p => p.Severity == severity); 

if (filterByUser) 
    logs = logs.Where(p => p.User == user); 

ale zastanawiałem się, czy to metoda skuteczna? Ile zapytań wykona linq?

+0

Spojrzałem na odpowiedź i myślę, że ta metoda - choć może być mniej wydajna, z pewnością jest znacznie lepsza z punktu widzenia bezpieczeństwa typu. Wszakże na początku LINQ został zaprojektowany w celu uniknięcia zapytań dynamicznych, więc jest to bezsensowne, a po drugie zawsze jest podatne na SQL Injection, jeśli nie jesteś ostrożny. –

Odpowiedz

2

Można użyć dynamicznej LINQ (ScottGu's Article)

Więc można łatwo tworzyć, gdy klauzula w ciąg, a następnie przekazać je do przypadku metoda:

public string GetWhereClause() 
{ 
string whereClause = ""; 
.... 
return whereClause 
} 

var logs = context.Logs.Where(GetWhereClause()); 

Nadzieja to pomaga;)

+2

Porównaj z podanym przeze mnie kodem, który sposób jest według Ciebie skuteczniejszy? – silent

5

Tak, myślę, że to jest skuteczne. Żadne zapytania nie będą wykonywane przez ten kod, ponieważ nie próbują odczytać niczego z "logów". Gdy tak się stanie, powinien uwzględnić oba warunki w tym samym zapytaniu (to jest klauzula WHERE, która obejmuje oba warunki).

ALE, jeśli używasz LINQ i martwisz się wydajnością, naprawdę musisz sprawdzić wszystko, co piszesz, używając narzędzi do sprawdzenia, które zapytania faktycznie są uruchamiane. Możesz to zrobić za pomocą programu SQL Server Profiler.