2010-08-06 9 views
8

Dada una tabla comocadenas de agregado o participar en LINQ to SQL (SQL Server)

ID | Name | City 
1 | X | Y 
2 | Z | Y 
3 | W | K 

quiero producir un resultado como

ID | Description 
1 | Y (X, Z) 
3 | K (W) 

Probé algo así como

From C In Clients Group C By C.ID, C.City _ 
Into G = Group Select New With {.ID = ID, .Description = City & _ 
" (" & (From C In Clients Select C.Name).Aggregate(Function(X, Y) X & ", " & Y) & ")"} 

Que me dio un error "El operador de consulta 'Agregar' no es compatible." también trató

From C In Clients Group C By C.ID, C.City _ 
Into G = Group Select New With {.ID = ID, .Description = City & _ 
" (" & String.Join((From C In Clients Select C.Name).ToArray, ", ") & ")"} 

que me dio el error "no se admite traducción a SQL"

Entonces, ¿cómo puedo hacer esto?

Respuesta

21

Hackeé esto en C# y parece dar lo que quieres. Le dejaré la traducción a VB.

var clients = from c in context.Clients 
       group c by c.City into cities 
       select new { 
        ID = cities.First().ID, 
        City = cities.Key, 
        Names = string.Join(",", (from n in cities select n.Name).ToArray()) 
       }; 

foreach (var c in clients) { 
    Console.WriteLine(string.Format("{0}| {1} ({2})", c.ID, c.City, c.Names)); 
} 
+0

awesome! Me pregunto por qué la concatenación + unir no funciona, y unirme solo funciona ... vaya figura – ariel

+0

Gracias hombre. Esto funciona como un encanto ... el problema para mí fue la consulta integrada. – Merritt

+0

Sin embargo, lo hace en el cliente, que es no deseado en la mayoría de los casos. –

0

El error significa que su operación LINQ no se puede realizar en SQL Server en TSQL, como usted lo ha escrito.

Para lograr lo que desea, deberá seleccionar/evaluar la mayor cantidad posible de sus datos base y luego realizar la agregación en un segundo paso. Un proceso de dos o más pasos no es ideal, pero se puede hacer.