Pregunta

Estoy reescribiendo una aplicación que necesita duplicar la lógica de alfabetización de un antiguo sistema de mainframe. En el antiguo sistema de mainframe, los ID de grabación de cambio de artículo están alfabetizados de A través de Z, y luego comienzan con AA, AB, etc. Desafortunadamente, tanto SQL Server como .NET quieren poner AA entre A y B, así que tengo que saltar a través de algunos aros. Estoy tratando de ordenar los ID de cambio primero descendiendo la longitud y luego, al alfabetizar en orden descendente.

Aquí está el método que estoy usando para recuperar los datos:

protected internal IList<TeamViewModel> GetTeams(string recordId, string changeId)
{
    var viewModels = (from x in repository.Teams
               where x.RecordId == recordId && x.ChangeId.Length <= changeId.Length && 
                 (x.ChangeId.CompareTo(changeId) == -1 || x.ChangeId.CompareTo(changeId) == 0)
               orderby x.ChangeId.Length descending, x.ChangeId descending, x.ChangeId descending
               group x by x.TeamId into grp
               select grp.FirstOrDefault())
               .ToList()
               .Select(TeamViewModel.FromEntity)
               .ToList();

            return viewModels;
}

Cada "registro" tiene una colección de registros de cambio, y cada cambio registra una propiedad de cambio y teamid que realizó el cambio. Estoy tratando de obtener el registro "más nuevo" (de acuerdo con la lógica de clasificación del mainframe anterior), cambiar el registro para cada distintivo Teamid. En otras palabras, estoy intentando ordenar los registros, agruparlos por equipo y luego tomar el primer registro de cada grupo.

La propiedad Repository.Teams devuelve un iQeryable que envuelve el objeto declarado en mi objetoContext.

Lo que realmente sopla mi mente es que esta consulta funciona bien cuando lo ejecuto en LinqPad (con la configuración predeterminada) y este mismo método se ejecuta bien desde las pruebas de unidad cuando he inyectado una simura de mi Repositorio en esta clase, que he configurado para emitir exactamente los mismos datos que están en la base de datos SQL.

Pero cuando este método se ejecuta en tiempo de ejecución, se comporta como si la línea con los objetos de trabajo se omiten por completo y, de hecho, me da los mismos resultados que i GE TIN LINQPAD (con la configuración predeterminada) cuando comento a la línea con el Pedidos. SQL Profiler muestra que el SQL generado está casi imposible de descifrar por un humano, pero que no contiene la palabra "orden" en cualquier lugar.

Como una nota final, cuando configuro LinqPad para usar mi conjunto de datos escrito generado por EF dentro de la Asamblea de My Project, obtengo los mismos resultados que veo en el tiempo de ejecución, con los resultados que aparecen como si los pidebegos se ignoran.

Desearía poder mostrar resultados reales, pero los datos son propietarios, por lo que solo considera que los resultados correctos, según lo proporcionado por LinqPAD y las pruebas de mi unidad, contienen registros de cambio con IDS como "Y" y "Z", donde inexplicable (Para mí) Los resultados que veo en mi proyecto en tiempo de ejecución son como "A" y "B".

¿Puede alguien ver qué está ocurriendo aquí, y de lo tanto, lo que necesito cambiar para hacer esta función como estoy esperando?

Mi proyecto está usando la entidad Marco 5.0 y estoy usando Linqpad 4.42.01.

¡Muchas gracias!

¿Fue útil?

Solución

Grupo por no garantiza retener el orden original.Si desea ordenar, debe ordenar después del grupo por.

De hecho, ni siquiera tiene sentido ordenar antes de un grupo por, ya que el grupo por el grupo se garantiza para cambiar el orden (a menos que solo haya un solo grupo).

Otros consejos

Haré una conjetura salvaje ...

Tus cambios son todas la misma longitud.La base de datos los tiene asignados como una columna de char (10) o algo en lugar de un varchar, por lo que es realmente "a" y ab es realmente "ab".Mainframes y Cobol y archivos planos con compensaciones vienen a la mente como mi fundamento.Si este es el caso, tendría que recortar () el cambio primero antes de obtener la longitud.

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