2014-04-23 7 views
5

Warum fragt EF 6 die Datenbank nach allen Datensätzen mit dem folgenden Code ab?DbSet <T>. Wo (Wo). ToList() - warum SQL where-Klausel nicht enthält?

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(); 
    } 

erzeugt die folgende Ausgabe

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] 

Zwei Fragen:

  1. Warum ist nicht die Abfrage mit der Anweisung, wo ausgeführt?
  2. Wie bekomme ich die Abfrage mit der WHERE-Anweisung auszuführen?
+0

Von Thema Frage: Was ist der Zweck, einen Standardwert von Null für den Parameter 'Where' festzulegen? – DaveParsons

+0

Es gibt keins. :) Ich bearbeite immer noch die Methode und die Klasse, zu der sie gehört. Ich hatte ursprünglich die Idee, eine find-Anweisung mit einer optionalen where-Klausel zu verwenden, entschied mich jedoch für eine separate FindAll() -Methode, entfernte jedoch nicht den Standardwert für Find. Gute Frage. –

Antwort

9

Sie verwendet einen Func<T,bool> eher als ein Expression<Func<T,bool>> und so haben Sie (irgendwo) einen Übergang von der Datenbank Linq-to-Entities zu Linq-to-Objekte gezwungen. Es wird also im Speicher verarbeitet.


Und wie @Marc weist darauf hin, eine einfache Lösung sein kann:

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

Aber das wiederum hängt davon ab, ob der Angerufene-Code in einer Form vor, die entweder von Func<T,bool> erzeugen kann oder Expression<Func<T,bool>> (normalerweise wird ein Lambda in jedes Formular konvertiert)

+1

Gute Augen - gut gefleckt; Addieren: Das Fix * könnte * so einfach sein wie das Ändern der ersten Zeile: 'public virtual Liste Suchen (Ausdruck > where = null)' –