2015-11-18 7 views
7

Ich erstelle derzeit eine Anwendung in C# 4.0 mit EntityFramework 6.0.Where-Klausel nicht in SQL-Abfrage enthalten

Ich versuche, eine Liste des Elements aus der Datenbank abzurufen, aber das Problem besteht darin, dass die vom EF-Framework generierte SQL-Abfrage die WHERE-Klausel nicht enthält.

So wird die gesamte Tabelle/Ansicht in den Speicher geladen und es dauert etwa 10 Sekunden, um nur 2 oder 3 Elemente zu erhalten.

Im Folgenden wird das Verfahren von meinem GenericRepostitory:

public IList<TEntity> GetList(Func<TEntity, bool> where, params Expression<Func<TEntity, object>>[] navigationProperties) 
{ 
    using (var dbContextScope = contextScopeFactory.CreateReadOnly()) 
    { 
     IQueryable<TEntity> dbQuery = Context.Set<TEntity>().AsQueryable(); 

     foreach (Expression<Func<TEntity, object>> navigationProperty in navigationProperties) 
      dbQuery = dbQuery.Include<TEntity, object>(navigationProperty); 

     var list = dbQuery 
      .AsNoTracking() 
      .Where(where); 

     Context.Database.Log = s => Debug.WriteLine(s); 

     return list.ToList<TEntity>(); 
    } 
} 

Und ich es so nennen:

var repository = repositoryFactory.Get<Context, Entity>(); 
var items = repository.GetList(x => x.FakeID <= 10); 

Die Rückkehr Ergebnis ist gut, aber es dauert ca. 10 Sekunden abgerufen werden. Und wenn das Debug die geschriebene SQL-Abfrage schreibt, ist die WHERE-Klausel nirgendwo

Wie kann ich meine Funktion GetList ändern, um die WHERE-Klausel aufzunehmen?

Ich hoffe, ich war genug klar mit diesen Informationen und es tut mir leid für mein Englisch. Es ist nicht meine Muttersprache:/

Wie dem auch sei, wir danken Ihr für Ihre Hilfe

+1

'Context.Set () .AsQueryable();' Was ist 'Context' wenn kein' DbContext '? 'AsQueryable' sollte hier nicht benötigt werden. –

+0

Ja sollte es nicht, ich habe es entfernt. Es war, weil ich seit ein paar Stunden mit diesem Problem feststeckte und viele verschiedene Dinge ausprobierte ... – Mica

Antwort

7

aus Ihrer Methode Signatur ändern

GetList(Func<TEntity, bool> where, ... 

zu

GetList(Expression<Func<TEntity, bool>> where, ... 

Sie können es immer noch anrufen mit einem Lambda, wie du es jetzt tust. Die Where wurde als "linq-to-objects" über die vollständige Liste, die aus der Datenbank gelesen wurde, verwendet. Mit dem Ausdruck kann EF das lesen, um den benötigten sql zu generieren.

+0

Danke, es funktioniert! :) – Mica

7

Der Typ des where Parameter ist Func<TEntity, bool>, so

dbQuery.Where(where) 

die Methode Enumerable.Where Erweiterung verwendet, vor dem Filtern der Daten in den Speicher zu laden. Wenn Sie die Queryable.Where Methode verwenden möchten (die SQL übersetzt wird) benötigen Sie einen Expression<Func<TEntity, bool>> Parameter

public IList<TEntity> GetList(Expression<Func<TEntity, bool>> where, 
           params Expression<Func<TEntity, object>>[] navigationProperties) 
+0

Dank dir und deiner Erklärung. Ich verstehe den Unterschied jetzt besser! :) – Mica

Verwandte Themen