我有以下控制器操作方法
public ActionResult BondCompletion(DateTime? ToDate)
{
List<BondCompletionViewModel> bondCompletionViewModel = new List <BondCompletionViewModel>();
if (ToDate != null)
{
bondCompletionViewModel = db.Employees.Select(y => new
{
y.JoiningDate ,
y.Commitments ,
y.EmployeeId ,
y.Name
})
.Where(x => x.JoiningDate.AddMonths(x.Commitments.Value).Month == ToDate.Value.Month)
.Select(z => new BondCompletionViewModel
{
EmployeeId = z.EmployeeId.Value,
EmployeeName = z.Name,
StartDate = z.JoiningDate,
EndDate = z.JoiningDate//.AddMonths(x.Commitments.Value)
}).ToList();
}
return View(bondCompletionViewModel);
}
在上面的方法中,Commitments是nullable int,JoiningDate是datetime。如果我显示以下错误
,我运行时“ LINQ to Entities无法识别方法&#39; System.DateTime AddMonths(Int32)&#39;方法,此方法无法转换为商店表达式。“
请指导我如何解决此错误。
答案 0 :(得分:9)
你的问题不是linq。您的问题是EF不知道如何将该语句(z.JoiningDate.AddMonths(x.Commitments.Value))转换为SQL。
如果您在选择之前使用ToList(),它应该可以工作。
否则你应该使用
EntityFunctions.AddMonths(z.JoiningDate, x.Commitments.Value)
哪个EF确实可以转换为SQL
换句话说
.Select(z => new BondCompletionViewModel
{
EmployeeId = z.EmployeeId.Value,
EmployeeName = z.Name,
StartDate = z.JoiningDate,
EndDate = EntityFunctions.AddMonths(z.JoiningDate, x.Commitments.Value)
}).ToList();
修改强> DbFunctions是使用的新EF 6类而不是EntityFunctions
答案 1 :(得分:4)
您可以使用EntityFunctions.AddMonths
此功能转换为数据库中的相应功能。
用法的
EntityFunctions.AddMonths(z.JoiningDate, x.Commitments.Value)
答案 2 :(得分:0)
您可以使用SqlFunction类:
.Where(x => SqlFunctions.DateAdd("month",x.Commitments.Value,x.JoiningDate).Month == ToDate.Value.Month)