Después de mucha búsqueda de Google y experimentación de código, estoy perplejo sobre un problema complejo de C# LINQ-a-objetos que en SQL ser fácil de resolver con un par de ROW_NUMBER() ... PARTITION BY funciones y una subconsulta o dos.Índice de LINQ-a-objetos dentro de un grupo + para diferentes agrupaciones (también conocido como ROW_NUMBER con equivalente PARTITION BY)
Así es, en palabras, lo que trato de hacer en code-- el requisito fundamental es la eliminación de documentos duplicados de una lista:
- En primer lugar, el grupo de una lista por (Document.Title, documento. sourceid), asumiendo una definición (simplificado) clase como esta:
class Document { string Title; int SourceId; // sources are prioritized (ID=1 better than ID=2) }
- Dentro de ese grupo, asignar a cada documento un índice (por ejemplo Índice 0 == primera documento con este título de esta fuente, Índice 1 = segundo documento con este título de esta fuente, etc.). Me encantaría el equivalente de ROW_NUMBER() en SQL.
- Ahora agrupe por (Document.Title, Índice), donde se calculó el Índice en el Paso # 2. Para cada grupo, devuelva solo un documento: el que tiene Document.SourceId más bajo.
Paso # 1 es fácil (por ejemplo codepronet.blogspot.com/2009/01/group-by-in-linq.html), pero yo estoy difuminados en los pasos # 2 y # 3. Parece que no puedo construir una consulta C# LINQ sin garabatos rojos para resolver los tres pasos.
La publicación de Anders Heilsberg en this thread es la respuesta a los pasos 2 y 3 anteriores si pudiera obtener la sintaxis correcta.
Preferiría evitar el uso de una variable local externa para hacer el cálculo del índice, como se recomienda en slodge.blogspot.com/2009/01/adding-row-number-using-linq-to-objects.html, ya que esa solución se rompe si la variable externa se modifica.
De manera óptima, el paso de agrupar por título podría hacerse primero, de modo que las agrupaciones "internas" (primero por origen para calcular el índice y luego por índice para filtrar duplicados) pueden operar en pequeños números de objetos en cada grupo "por título", ya que el número de documentos en cada grupo de título por lo general es menor de 100. ¡Realmente no quiero una solución N !
Sin duda podría resolver esto con bucles foreach anidados, pero parece ser el tipo de problema que debería ser simple con LINQ.
¿Alguna idea?
¡Hola DahlbyK - esto es genial! Tu solución se ve bien. Ahora no me siento tan mal por no ser capaz de resolverlo por mi cuenta la primera vez. Descubrí la sobrecarga Select-with-index pero no pude encontrar la forma de ingresarlo en una consulta LINQ. Algún código de cinturón negro en su extremo, gracias por la ayuda y la educación en lo que es posible. –