2014-04-23 10 views
5

Perché EF 6 sta interrogando il database per tutti i record con il seguente codice?DbSet <T>. Dove (dove) .ToList() - perché SQL non include la clausola 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(); 
    } 

produce il seguente output

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] 

Due domande:

  1. Perché non è la query eseguita con l'affermazione in cui?
  2. Come si ottiene la query da eseguire con l'istruzione where?
+0

Di topic: Qual è lo scopo di impostare un valore predefinito di 'null' per il parametro' where'? – DaveParsons

+0

Non ce n'è uno. :) Sto ancora modificando il metodo e la classe di cui fa parte. Inizialmente avevo l'idea di usare una dichiarazione find con una clausola where opzionale, ma ho optato per un metodo FindAll() separato ma non ho rimosso il valore predefinito per Find. Buona domanda però. –

risposta

9

è stato utilizzato un Func<T,bool> piuttosto che un Expression<Func<T,bool>> e così vi ho costretti (da qualche parte) una transizione dal database Linq to Entities a Linq to Objects. Quindi è processato in memoria.


E, come sottolinea @ Marc, una semplice correzione può essere:

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

Ma questo, a sua volta, dipende dal fatto che il codice chiamante è in una forma in grado di generare uno dei Func<T,bool> o Expression<Func<T,bool>> (di solito, un lambda sarà convertibile in entrambe le forme)

+1

Buoni occhi - ben chiazzati; Vale la pena aggiungere: la correzione * potrebbe * essere semplice come cambiare la prima riga: 'Elenco virtuale pubblico Trova (Espressione > dove = null)' –