2017-01-03 2 views
1

Ich versuche, diese Abfrage Arbeit mit EF zu machen, aber es gibt eine Ausnahme aus:NotSupportedException: LINQ to Entities erkennt nicht die Methode

var c = ac.Communities.OrderBy(o => o.Posts.Count()) 
     .Skip(page*limit) 
     .Take(limit) 
     .Select(o => o.ToViewModel()).ToArray(); 

Die ToViewModel() Methode aus dem Community Modell sieht wie folgt aus:

public CommunityModel ToViewModel() 
{ 
    return new CommunityModel() 
    { 
     category = Category.Name, 
     created = CreationTime, 
     description = Description, 
     id = Id, 
     name = Name, 
     ownerId = Owner.Id, 
     postsCount = Posts.Count(), 
     score = Posts.Sum(o => o.Likes - o.Unlikes), 
     shortDescription = ShortDescription, 
     subscribersCount = Subscribers.Count(), 
    }; 
} 

Was mache ich falsch?

+0

Um Ihre 'ToViewModel' Methode auszuschließen, öffnet sich ein' .ToList() 'vor der 'Select' und sehen, ob Sie immer noch das Problem haben. – Stuart

+0

@Stuart Das funktioniert, danke! Also, im Grunde genommen ist die 'List' nicht länger ein' IQueryable', also versucht sie nicht, dies in SQL Queries für die Datenbank zu übersetzen, oder? Das bedeutet, dass es all das in der Erinnerung tut, die "Community" -Klasse als ein tatsächliches Objekt und nicht als eine db-Einheit behandelnd, richtig? – Reynevan

+0

Das ist richtig, Sie erzwingen eine Aufzählung der 'IQueryable' an dem Punkt,' ToList' zu verwenden, dann sind die folgenden Linq-Methoden auf eine in Memory-Auflistung und müssen nicht über die Übersetzung in SQL – Stuart

Antwort

2

Entity Framework können die Methoden nicht übersetzen Sie in ToViewModel verwenden. Verwenden Sie ToList() eifrig die Ergebnisse zu laden, Karte dann diejenigen statt, die Notwendigkeit vermieden wird für EF zu versuchen, die SQL zu übersetzen:

var c = ac.Communities.OrderBy(o => o.Posts.Count()) 
    .Skip(page*limit) 
    .Take(limit) 
    .ToList() 
    .Select(o => o.ToViewModel()).ToArray(); 
1

Dies ist, weil LINQ zu Entities, versuchen, .ToViewModel in eine SQL-Abfrage zu konvertieren, die nicht vom Konverter erkannt wird.

Wenn es nicht viele Ergebnisse sind durch .Take zurückgegeben, dann die beste Lösung die IQueryable zu List umstellen, indem sie es auf den folgenden ändern.

var c = ac.Communities.OrderBy(o => o.Posts.Count()) 
     .Skip(page*limit) 
     .Take(limit) 
     .ToArray() // This will return a Community array 
     .Select(o => o.ToViewModel()) // This is a IEnumerable<CommunityModel> 
     .ToArray(); // This will cast // This is a cast for Community array 
+0

Ja, das ist was ich benutzen werde. Vielen Dank. Nur aus Neugier, aber: akzeptieren Dies ist, weil LINQ to Entities, versuchen zu konvertieren. ToViewModel zu einer SQL-Abfrage, die nicht vom Konverter erkannt wird. Wenn nicht viele Ergebnisse von .Take zurückgegeben werden, wird die beste Lösung das IQueryable in die Liste konvertieren, indem Sie Folgendes ändern .... sonst ...? – Reynevan

Verwandte Themen