Linq to SQL: ¿Cómo puedo ordenar por un objeto compuesto?
-
11-07-2019 - |
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'
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!