Para los fines educativos que trataron de convertir la siguiente expresión LINQ del libro "Linq en acción" en VB.netLINQ no lo hace el grupo en VB.Net
C# original
var list =
from book in SampleData.Books
group book by new { book.Publisher.Name, book.Subject }
into grouping
select new {
Publisher = grouping.Key.Publisher,
Subject = grouping.Key.Subject,
Book = grouping
};
Mi intento:
Dim list = _books.GroupBy(Function(book) New With {.Publisher = book.Publisher.Name,
book.Subject}).
Select(Function(grouping) New With {.Publisher = grouping.Key.Publisher,
.Subject = grouping.Key.Subject,
.Books = grouping})
For Each item In list
Console.WriteLine("Publisher:" & item.Publisher & ", Subject:" & item.Subject)
For Each Book In item.Books
Console.WriteLine(" " & Book.Title)
Next
Next
Esto lleva a la siguiente salida:
Publisher:FunBooks, Subject:Fun
Funny Stories
Publisher:Joe Publishing, Subject:Work
LINQ rules
Publisher:Joe Publishing, Subject:Work
C# on rails
Publisher:Joe Publishing, Subject:Fun
All your base are belong to us
Publisher:FunBooks, Subject:Fun
Bonjour mon Amour
Espero que los libros "LINQ rules" y "C# on rails" estén agrupados, así como los libros "Funny Stories" y "Bonjour mon Amour" porque tienen el mismo Publisher and Subject. Mi clave anónima consiste en un nuevo objeto de dos cadenas simples.
Ya he intentado buscar en SO, pero other (or) las respuestas no resuelven mi problema. Incluso algunos traductores de código como telerik o carlosag no son de ayuda en este caso.
Si esto funciona muy bien; ¡muchas gracias! Guau, una respuesta del propio Jon Skeet. Me siento honrado. :-) – Markus
Probé mi consulta que estaba fallando debido a esto en LINQPad y utilicé un LINQ para el origen de Entidades. En mi código, en realidad estoy materializando la consulta (ToList) y ejecutando la consulta de grupo, ya que tengo que hacer algunos cálculos por filas entre tanto. Esto me lleva a pensar que esto es un problema en LINQ to Objects pero no LINQ to Entities. Supongo que esto se debe a que en LINQ to Entities, la expresión de agrupación se traduce a TSQL, mientras que en LINQ to Objects, el código hash se utiliza para la igualdad de clave de grupo. ¿Esto suena correcto? – pseudocoder
@pseudocoder: No, no se trata del código hash, sino de qué propiedades se usan para determinar la igualdad. Suena como LINQ to Entities trata * todas las propiedades * como propiedades clave ... lo que me suena como un error. Esto no es un "problema" en LINQ to Objects; solo se trata de cómo funcionan los tipos anónimos en VB. –