Ich bin mir nicht ganz sicher, wo der Wert Criteria.Period
in Ihrer Beispielabfrage herkommt.
Aber ich denke, Sie versuchen, sowohl Mieten und Abschlüsse für alle verfügbaren Monate zu lesen (und dann können Sie es leicht filtern). Ihre Abfrage könnte schief gehen, wenn die erste Tabelle (Termination) keine Datensätze für einen bestimmten Monat enthält (z. B. Mai). Dann würde die select
-Klausel nicht mit "May" als Parameter überhaupt aufgerufen werden, und selbst wenn Sie einige Daten in der zweiten Tabelle (Hires) hätten, wären Sie nicht in der Lage, sie zu finden.
Dies kann elegant mit der Concat method gelöst werden (siehe MSDN-Beispiele). Sie könnten alle termniations wählen und alle Mitarbeiter (in eine Datenstruktur eines bestimmten Typs) und dann die Gruppe alle Daten von Monat:
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) }
Wenn jetzt Blick auf den Code, ich bin ziemlich sicher, dass es einige kürzere Weg ist, um dies zu schreiben. Auf der anderen Seite sollte dieser Code gut lesbar sein, was ein Vorteil ist. Beachten Sie auch, dass es nicht wichtig ist, dass wir den Code in einige Unterabfragen aufteilen. Dank der Lazy Evaluation von LINQ to SQL sollte dies als eine einzige Abfrage ausgeführt werden.
Zeigen Sie uns Ihr Datenbankschema würde helfen. – Blindy
Was sind 'Criteria.Period' und' Criteria.Period.Value.Month'? –
Was lässt Sie unsicher sein, dass es richtig ist? Kompiliert es? Hast du es versucht? Gibt es die Ergebnisse, die Sie erwarten? –