我是LINQ to SQL的新手,我想知道如何在LINQ中实现这样的东西:
Month Hires Terminations
Jan 5 7
Feb 8 8
Marc 8 5
Run Code Online (Sandbox Code Playgroud)
到目前为止我已经得到了这个,我认为它有问题,但我不确定:
from term1 in HRSystemDB.Terminations
group term1 by new { term1.TerminationDate.Month, term1.TerminationDate.Year } into grpTerm
select new HiresVsTerminationsQuery
{
Date = Criteria.Period,
TerminationsCount = grpTerm.Count(term => term.TerminationDate.Month == Criteria.Period.Value.Month),
HiresCount = (from emp in HRSystemDB.Persons.OfType<Employee>()
group emp by new { emp.HireDate.Month, emp.HireDate.Year } into grpEmp
select grpEmp).Count(e => e.Key.Month == Criteria.Period.Value.Month)
});
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我不太确定Criteria.Period样本查询中的值来自何处.
但是,我认为您正在尝试阅读所有可用月份的招聘和终止(然后您可以轻松过滤它).如果第一个表(终止)没有包含某个指定月份的任何记录(比如五月),那么您的查询可能会出错.然后select不会使用"May"作为参数调用该子句,即使您在第二个表(代表Hires)中有一些数据,那么您也无法找到它.
使用Concat方法可以很好地解决这个问题(参见MSDN示例).您可以选择所有termniations和所有雇员(进入某种类型的数据结构),然后按月分组所有数据:
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) }
Run Code Online (Sandbox Code Playgroud)
现在查看代码时,我很确定有一些更短的方法来编写它.另一方面,这段代码应该是非常易读的,这是一个好处.另请注意,我们将代码拆分为几个子查询并不重要.由于LINQ to SQL的惰性评估,这应该作为单个查询执行.