Linq to SQL Date转换错误

时间:2017-12-11 16:51:30

标签: c# sql linq asp.net-web-api

我正在尝试在可选日期字段上过滤Linq to SQL查询,但我遇到了问题。这是方法:

public List<ReferralTrackerModel> GetDoctorDailySchedule(int DBID, int DoctorCode, string apptDateFrom, string apptDateTo)
    {
        using (var dbIMEC = getISSDataContext(DBID))
        {
            var eResults = from c in dbIMEC.tblCases
                           join s in dbIMEC.tblServices on c.ServiceCode equals s.ServiceCode
                           join e in dbIMEC.tblExaminees on c.ChartNbr equals e.ChartNbr
                           join p in dbIMEC.tblPublishOnWebs on c.CaseNbr equals p.TableKey
                           join ct in dbIMEC.tblCaseTypes on c.CaseType equals ct.Code
                           join l in dbIMEC.tblLocations on c.DoctorLocation equals l.LocationCode.ToString()
                           where p.UserCode == DoctorCode
                           where p.TableType == "tblCase"
                           where p.PublishOnWeb
                           where p.TableKey == c.CaseNbr
                           where p.UserType == "DR"
                           //where c.ApptDate >= DateTime.Parse(apptDateFrom)
                           //where c.ApptDate <= DateTime.Parse(apptDateFrom).Date.AddHours(23).AddMinutes(59).AddSeconds(59)
                           select new ReferralTrackerModel()
                           {
                               CaseNbr = c.CaseNbr,
                               ClaimNbr = c.ClaimNbr.Trim(),
                               ExamLocationName = l.Location.Trim(),
                               ExamineeName = e.LastName.Trim() + ", " + e.FirstName.Trim(),
                               CaseType = ct.Description.Trim(),
                               ServiceDesc = s.Description.Trim(),
                               ApptDateTime = c.ApptTime.ToString().Trim(),
                               ApptDateTimeDate = DateTime.Parse(c.ApptTime.ToString())
                           };

            if (apptDateTo.Length > 0)
            {
                var dateTo = DateTime.Parse(apptDateTo);
                eResults = eResults.Where(r => r.ApptDateTimeDate <= dateTo);
            }

            var lst = eResults.ToList();

            return lst;
        }
    }

      The date calculation in the main part of the query is working as expected but the portion after the if statement is not. I am getting the following error back from the API controller:

“message”:“方法'System.DateTime Parse(System.String)'没有支持的SQL转换。”

我的目的是通过可选的apptDateTo字段过滤结果。

2 个答案:

答案 0 :(得分:2)

DateTime.Parse的结果存储到变量并使用它。

        if (apptDateTo.Length > 0)
        {
            var parsedDate = DateTime.Parse(apptDateTo);
            eResults = eResults.Where(r => r.ApptDateTimeDate <= parsedDate);
        }

问题是LINQ to SQL正在尝试将DateTime.Parse调用转换为SQL中的某些内容,并且它不知道如何执行此操作。这会阻止LINQ to SQL尝试。

答案 1 :(得分:0)

LINQ表达式以及在表达式树实现到内存之前添加到表达式树中的任何内容都必须可以转换为后备数据存储的查询。在这种情况下,SQL。 SQL确实没有DateTime.Parse()的翻译。

首先解析该值,完全使用C#代码并与LINQ查询无关,然后使用结果查询数据:

if (apptDateTo.Length > 0)
{
    var dateTo = DateTime.Parse(apptDateTo);
    eResults = eResults.Where(r => r.ApptDateTimeDate <= dateTo);
}

修改:我注意到您在整个LINQ代码中的其他几个地方也使用DateTime.Parse()。例如:

where c.ApptDate >= DateTime.Parse(apptDateFrom)

同样的原则也适用于此。您无法使用LINQ中的后备数据存储不支持的操作。首先解析该值,然后在查询中使用它。