No estoy muy seguro de dónde viene el valor Criteria.Period
en su consulta de muestra.
Sin embargo, creo que está intentando leer las contrataciones y terminaciones de todos los meses disponibles (y luego puede filtrarlas fácilmente). Su consulta podría salir mal si la primera tabla (Terminación) no incluyó ningún registro para un mes específico (por ejemplo, mayo). Entonces, la cláusula select
no se llamaría con "May" como parámetro e incluso si tenía algunos datos en la segunda tabla (que representa Hires), entonces no podría encontrarla.
Esto se puede resolver con elegancia usando el Concat method (vea ejemplos de MSDN). Se podría seleccionar todos termniations y todos los empleados (en una estructura de datos de algún tipo) y luego agrupar todos los datos por mes:
var terms = from t in HRSystemDB.Terminations
select new { Month = t.TerminationDate.Month,
Year = term1.TerminationDate.Year,
IsHire = false };
var hires = from emp in HRSystemDB.Persons.OfType<Employee>()
select new { Month = emp.HireDate.Month,
Year = emp.HireDate.Year
IsHire = true };
// Now we can merge the two inputs into one
var summary = terms.Concat(hires);
// And group the data using month or year
var res = from s in summary
group s by new { s.Year, s.Month } into g
select new { Period = g.Key,
Hires = g.Count(info => info.IsHire),
Terminations = g.Count(info => !info.IsHire) }
Al mirar el código de ahora, estoy bastante seguro de que es de alguna manera más corta para escribir esto Por otro lado, este código debe ser bastante legible, lo cual es un beneficio. También tenga en cuenta que no importa que dividamos el código en un par de subconsultas. Gracias a la evaluación lenta de LINQ to SQL, esto se debe ejecutar como una sola consulta.
Mostrar su esquema de base de datos ayudaría a eso. – Blindy
¿Qué es 'Criteria.Period' y' Criteria.Period.Value.Month'? –
¿Qué te hace sentir inseguro de que sea correcto? ¿Compila? ¿Has intentado ejecutarlo? ¿Da los resultados que esperas? –