2010-08-20 29 views
6

nicht. Wenn ich versuche, mein Repository in einem Sub Select aufzurufen, habe ich diesen Fehler erhalten.LINQ to Entities erkennt die Methode 'System.Linq.IQueryable

IGrpTextRepository rep = new GrpTextRepository(); 

     var query = new DetailViewModel 
     { 
      ViewDet = (from gh in _db.Grp 
         select new MultiDetailViewModel 
         { 
          Header = gh, 
          Txts = rep.FindAllLangTxtById(gh.GrpID) 

         }).ToList(), 
      Lang = _db.Language.ToList(), 

     }; 

Mein Interface ist

public interface IGrpTextRepository 
{ 
    IQueryable<GrpText> FindAllLangTxtById(int GrpID); 
} 

public class GrpTextRepository : IGrpTextRepository 
{ 
    DBEntities db = new DBEntities(); 

    public IQueryable<GrpText> FindAllLangTxtById(int GrpID) 
    { 
     return (from lang in db.Language 
       join gtxts in db.GrpText on lang.LangID equals gtxts.LangID into jointxt 
       from fintxt in jointxt.DefaultIfEmpty() 
       where fintxt.GrpID == GrpID 
       select fintxt); 
    } 


} 

Hier ist die vollständige Fehlermeldung
System.NotSupportedException: LINQ to Entities nicht das Verfahren erkennen ‚System.Linq.IQueryable`1 [aaa.Models .GrpText] FindAllLangTxtById (Int32) 'Methode, und diese Methode kann nicht in einen Speicherausdruck übersetzt werden.

+0

Ich wünschte, ich könnte dies kurz erklären ... Wie viel wissen Sie bereits über die IQueryable-Schnittstelle, verzögerte Ausführung und Ausdrucksbäume? – jfar

Antwort

13

Die einfache Lösung ist, eine .ToList() vor Ihrer Auswahl (...) hinzuzufügen.

ViewDet = _db.Grp.ToList().Select(gh => new MultiDetailViewModel ...) 

diese Weise wird die ursprüngliche Anforderung an die Datenbank gehen, mit den Ergebnissen zurückkommen und Sie können sie dann neu projizieren eine select-Anweisung gegen Linq zu Objekten verwendet wird.

Aber ich muss fragen, warum es keine FK-Beziehung zwischen den Gruppen und den Texten und damit eine Entity Association zwischen den beiden gibt Ihnen Zugriff auf gh.GrpText und gelangen Sie zur Sammlung von Texten lazy geladen (oder eifrig geladen mit .Include()).

Wie @Doguhan Uluca in den Kommentaren hervorhebt, ist die Verwendung von ToList() riskant, da es dazu führt, dass alles in dieser Tabelle in den Speicher geladen wird. Sie sollten es nur für sehr kleine Sammlungen verwenden. Der richtige Ansatz besteht darin, Ihren Datenbankentwurf zu reparieren, damit Sie ihn effizient abfragen können.

+0

Ich habe bereits einen FK zwischen Gruppe und Text. . Ich möchte eine Unterabfrage mit einem linken Join mit meiner Sprachtabelle machen. Ich möchte die Liste jedes Gruppentextes in verschiedenen Sprachen. Wenn der Gruppentext kein Traduct für eine bestimmte Sprache ist, möchte ich das Ergebnis als null. –

+7

Ich rate davon ab, .ToList() in Ihrer Datenbanktabelle aufzurufen, das heißt, es sei denn, Sie möchten die gesamte Tabelle im Speicher laden. –

+0

@DoguhanUluca - Was ist die Alternative zum Aufruf von .ToList() in einer Situation wie dieser? – oonyalo

Verwandte Themen