如何在日期时间中添加月份并与Linq中的其他日期时间进行比较?

时间:2015-03-03 11:12:53

标签: c# linq

我有以下控制器操作方法

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;方法,此方法无法转换为商店表达式。

请指导我如何解决此错误。

3 个答案:

答案 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)