2014-04-23 13 views
5

Dlaczego EF 6 wysyła zapytanie do bazy danych dla wszystkich rekordów z następującym kodem?DbSet <T>. Gdzie (gdzie) .ToList() - dlaczego SQL nie zawiera klauzuli where?

public virtual List<T> Find(Func<T, bool> where = null) 
    { 
     _db.Configuration.LazyLoadingEnabled = false; 
     if (where == null) throw new NullReferenceException("The 'where' parameter of the Repository.Find() method is null.");  
     return _dbSet.Where(where).ToList(); 
    } 

wygeneruje następujące wyniki

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Sequence] AS [Sequence], 
    [Extent1].[Description] AS [Description], 
    [Extent1].[Instructions] AS [Instructions], 
    [Extent1].[WorkCenterOperationId] AS [WorkCenterOperationId], 
    [Extent1].[JobId] AS [JobId], 
    [Extent1].[JobAssemblyId] AS [JobAssemblyId], 
    [Extent1].[RowVersion] AS [RowVersion] 
    FROM [dbo].[JobOperations] AS [Extent1] 

dwa pytania:

  1. Dlaczego nie jest kwerenda wykonana z WHERE?
  2. Jak uzyskać wykonanie kwerendy za pomocą instrukcji where?
+0

Z pytania na temat: Jaki jest cel ustawienia domyślnej wartości 'null' dla parametru' where'? – DaveParsons

+0

Nie ma. :) Wciąż edytuję metodę i klasę, której jest częścią. Pierwotnie miałem pomysł użycia jednej instrukcji find z opcjonalną klauzulą ​​where, ale wybrałem osobną metodę FindAll(), ale nie usunąłem domyślnej wartości Find. Dobre pytanie. –

Odpowiedz

9

Używaliśmy Func<T,bool> raczej niż Expression<Func<T,bool>> i tak już zmuszony (gdzieś) przejście z bazy danych LINQ do podmiotów do LINQ-Objects. Więc jest przetwarzany w pamięci.


I jak @Marc zwraca uwagę, prosty fix może być:

public virtual List<T> Find(Expression<Func<T, bool>> where = null) 
... 

Ale to z kolei zależy od tego, czy kod wywołujący jest w formie, która może generować zarówno z Func<T,bool> lub Expression<Func<T,bool>> (zwykle lambda będzie można przekształcić do dowolnej postaci)

+1

Dobre oczy - dobrze widoczne; Warto dodać: poprawka * może * być tak prosta, jak zmiana pierwszej linii: 'publiczna wirtualna lista Znajdź (wyrażenie > gdzie = null)' –

Powiązane problemy