2016-10-01 2 views
1

Ich brauche zwei Abfragen und nach der Vereinigung Group Unoin, aber werfen "muss reduzierbaren Knoten sein" Ausnahme. im folgenden Beispielcode sind:Gruppe von nach Union werfen "muss reduzierbaren Knoten sein" Exception

public class ForumPost 
{ 
    public int ForumPostId { get; set; } 
    public string Message { get; set; } 
    public bool Deleted { get; set; } 
    public int ForumTopicId { get; set; } 
    public virtual ForumTopic ForumTopic { get; set; } 
} 

var query1 = _dbContext.ForumPosts 
    .Where(e => e.Deleted == true); 

var query2 = _dbContext.ForumPosts 
    .Where(e => e.Deleted == false); 

var query = query1.Union(query2); 

var list = query.GroupBy(e => e.ForumTopicId) 
    .Select(group => new 
    { 
     group.Key, 
     Total = group.Count() 
    }).Take(10) 
    .ToList(); 

Hat jemand mit diesem Problem konfrontiert?

+0

Funktioniert In-Memory-Gruppierung? – Tseng

+0

@Tseng: In-Memory funktioniert! –

Antwort

0

Ich denke, dieser Sonderfall nicht aktiviert war, aber wenn man einen Blick auf die EntityFramework Core-Roadmap nehmen, werden Sie in den „Critical O/RM-Funktionen“ die folgenden Einträge sehen:

Critical O/RM Funktionen

Die Dinge, die wir brauchen, bevor wir EF Core sagen, ist die empfohlene Version von EF. Bis wir diese Funktionen implementieren, wird EF Core für viele Anwendungen eine gültige Option sein, besonders auf Plattformen wie UWP und .NET Core, wo EF6.x nicht funktioniert, aber für viele Anwendungen wird das Fehlen dieser Funktionen EF6.xa zu einer besseren Option machen .

Abfrage

  • Verbesserte Übersetzung wird mehr Abfragen ermöglichen, erfolgreich auszuführen, mit mehr Logik in der Datenbank ausgewertet (statt in-memory).
  • GroupBy Translation wird die Übersetzung des LINQ GroupBy-Operators in die Datenbank und nicht in den Arbeitsspeicher verschieben.

So werden Sie nicht viel verlieren, wenn, wie dieses Problem zu umgehen, können Sie die Daten aus der Union Abfrage holen und die führen die GroupBy auf die in Speicherdaten (dh eine .ToList() oder .AsEnuberable() auf, es zu tun) bis die zwei Funktionen implementiert sind.

Soweit ich weiß, EntityFramework Core 1.1 is scheduled for Q4 2016 - Q1/2017, so dass Sie entweder warten oder die Problemumgehung, abhängig von der Frist Ihres Projekts. Wenn ich mich richtig erinnere, erwähnte Rowan Miller, dass sie die Releases synchron mit ASP.NET Core 1.1 halten wollen, was auch für Herbst 2016 geplant ist und dass es keinen technischen Grund gibt (dh eine Funktion, die ASP.NET Core 1.1 benötigt)), um dies zu tun, aber für den Moment ist es mit ASP.NET Core synchronisiert, kann aber oder kann nicht seine eigenen unabhängigen Release-Zyklen in Zukunft bekommen.

Oder wenn Sie sehr mutig sind und Ihre Webanwendung noch nicht produktionsbereit ist, können Sie versuchen the nightly builds.