Ho una semplice struttura a tabelle di servizi con ciascuna un numero di servizi. Nel database, questa è una tabella Service
e una tabella Facility
, in cui la tabella Facility
ha un riferimento a una riga nella tabella Servizio.Perché questa combinazione di Select, Where e GroupBy causa un'eccezione?
Nella nostra applicazione, abbiamo la seguente LINQ di lavoro:
Services
.Where(s => s.Facilities.Any(f => f.Name == "Sample"))
.GroupBy(s => s.Type)
.Select(g => new { Type = g.Key, Count = g.Count() })
Ma per ragioni indipendenti dalla mia volontà, il set di fonte è proiettata ad un oggetto non-entità prima della chiamata Where
, in questo modo:
Services
.Select(s => new { Id = s.Id, Type = s.Type, Facilities = s.Facilities })
.Where(s => s.Facilities.Any(f => f.Name == "Sample"))
.GroupBy(s => s.Type)
.Select(g => new { Type = g.Key, Count = g.Count() })
Ma ciò solleva la seguente eccezione, senza alcuna eccezione interna:
EntityCommandCompilationException: The nested query is not supported. Operation1='GroupBy' Operation2='MultiStreamNest'
Rimozione del Where
, però, lo fa funzionare, il che mi fa credere che è solo in questa specifica combinazione di metodo di chiamate:
Services
.Select(s => new { Id = s.Id, Type = s.Type, Facilities = s.Facilities })
//.Where(s => s.Facilities.Any(f => f.Name == "Sample"))
.GroupBy(s => s.Type)
.Select(g => new { Type = g.Key, Count = g.Count() })
C'è un modo per rendere il lavoro di cui sopra: selezionare per una non-entità oggetto e quindi utilizzare Where
e GroupBy
sul risultante interrogabile? L'aggiunta di ToList
dopo il Select
funziona, ma l'insieme di sorgenti di grandi dimensioni rende questo non fattibile (eseguirà la query sul database e quindi eseguirà la logica di raggruppamento in C#).
E di quale database e versione EF stiamo parlando? –
SQL Server 2014 e Entity Framework 6.1.1! –
Questa domanda fa parte della mia raccolta [LINQ-to-enter! = LINQ-to-objects] (http://stackoverflow.com/a/13352779/861716). –