Pregunta

Tengo la siguiente consulta de Linq a SQL, en la que intento hacer un GROUP BY de varias columnas:

return from revision in dataContext.Revisions
       where revision.BranchID == sourceBranch.BranchID-1
                && !revision.HasBeenMerged
       group revision by new Task(revision.TaskSourceCode.ToUpper(), 
                                  revision.TaskSourceID)
       into grouping
       orderby grouping.Key ascending
       select (ITask)grouping.Key;

Esto arroja InvalidOperationException (" No se puede ordenar por tipo 'Task'. ").

¿Hay una interfaz que Task debe implementar (ya ya implementa IComparable, IComparable < ITask >)? La tarea debe ser una entidad Linq to SQL (actualmente no lo es, ya que no hay una tabla correspondiente). ¿O es esto algo que Linq to SQL no admite?

Tenga en cuenta que ya probé un tipo anónimo para la agrupación, que falló con una InvalidOperationException similar:

...
group revision by new { Code = revision.TaskSourceCode.ToUpper(),
                        Id = revision.TaskSourceID } 
...

Para lo que vale, tenga en cuenta que el objeto Task es un compuesto de 2 campos; uno es un solo carácter (típicamente 'S' o 'B') y el otro es un int (en realidad una base de datos cruzada " clave externa " si lo desea). El acto de ordenar por Tareas solo compara sus representaciones de cadena; P.EJ. Tarea 'B101' & Lt; Tarea 'S999'

¿Fue útil?

Solución

Parece que ya tiene su solución, pero solo FYI LINQ to SQL admite .ToUpper().

Por ejemplo:

NorthwindDataContext dc = new NorthwindDataContext();
Product product = dc.Products.Single(p => p.ProductName.ToUpper() == "CHAI");

Se traduce a:

exec sp_executesql N'SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
FROM [dbo].[Products] AS [t0]
WHERE <b>UPPER([t0].[ProductName]) = @p0</b>',N'@p0 nvarchar(4)',@p0=N'CHAI'

Espero que eso ayude.

Otros consejos

Bien, descubrí esto. Tuve dos problemas; en primer lugar, ToUpper () no se traduce a SQL, y en segundo lugar, no creo que Linq to SQL admita orderby en objetos; al menos no no entidades. Al descomponer el orden en sus columnas constituyentes, todo comenzó a funcionar según lo planeado.

return from revision in dataContext.Revisions
       where revision.BranchID == sourceBranch.BranchID-1
                && !revision.HasBeenMerged
       group revision by new { revision.TaskSourceCode, 
                                  revision.TaskSourceID }
       into grouping
       orderby grouping.Key.TaskSourceCode, 
               grouping.Key.TaskSourceID ascending
       select (ITask)new Task(grouping.Key.TaskSourceCode, 
                              grouping.Key.TaskSourceID);

Creo que necesita una selección antes de su grupo: desea convertir objetos a Tareas, luego ordenar por otra cosa (Task.start o algo)

Linq to SQL puede admitir String.ToUpper (), pero no admite Char.ToUpper (), que es lo que necesitaría para esta tabla y columna en particular. ¡Pero gracias por la información de todos modos!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top