我正在尝试在可选日期字段上过滤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字段过滤结果。
答案 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中的后备数据存储不支持的操作。首先解析该值,然后在查询中使用它。