2017-12-11 4 views
0

선택적 날짜 필드에서 Linq to SQL 쿼리를 필터링하려고하는데 문제가 있습니다. 메서드는 다음과 같습니다.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

LINQ 표현식과 메모리에 구체화되기 전에 표현식 트리에 추가되는 모든 내용은 백업 데이터 저장소에 대한 쿼리로 변환 할 수 있어야합니다. 이 경우 SQL. 그리고 SQL은 실제로 DateTime.Parse()에 대한 번역이 없습니다.

데이터를 쿼리 결과를 사용 후, 완전히 LINQ 쿼리에 C# 코드와 관련이없는에서 먼저 값을 구문 분석 :

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

편집 : 당신은 또한에 DateTime.Parse()을 사용하고 있는지 나는 알 LINQ 코드 전체에서 여러 다른 장소. 예 :

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

동일한 원칙이 적용됩니다. LINQ에서 백업 데이터 저장소가 지원하지 않는 작업은 사용할 수 없습니다. 값을 먼저 구문 분석 한 다음 쿼리에서 사용합니다.

+0

이전에 시도했지만 여전히 동일한 오류가 발생합니다. 나는 당신의 코드를 시도했지만 여전히 오류가 발생합니다. 대답 해줘서 고마워. – CrystalLake62

+0

@ CrystalLake62 : 방금 답변을 업데이트했습니다. LINQ 코드 전체에서'DateTime.Parse()'를 여러 번 사용 한 것처럼 보입니다. 동일한 솔루션이 적용되므로 어디서든 사용해야합니다. – David

+0

이상한 점은 쿼리의 윗부분이 datetime 변환을 사용해도 원하는대로 작동한다는 것입니다. 여전히 조건부에 문제가 있습니다. – CrystalLake62

2

DateTime.Parse의 결과를 변수에 저장하고이를 사용하십시오.

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

문제는 SQL에 LINQ는 SQL에 뭔가에 DateTime.Parse 전화를 설정하려고하고 그렇게하는 방법을 알고하지 않습니다. LINQ to SQL 시도를 중지합니다.

+0

여전히 같은 오류가 발생합니다. – CrystalLake62

+0

쿼리의 선택 부분에서'ApptDateTimeDate'를'DateTime.Parse (c.ApptTime.ToString())'로 정의했기 때문입니다. 따라서 선택적 where 절에서 해당 필드에 대한 구문 분석 호출을 대체합니다. 그리고 그 루프는'DateTime.Parse'로 돌아가 SQL 로의 적절한 변환을하지 못하므로 여러분이 얻고있는 오류입니다. 'ApptTime'은 데이터베이스 또는 다른 유형의 문자열입니까? 문자열이라면, 다소 엉망이됩니다. LINQ를 SQL에 버리고 필기체 SQL을 사용하거나 모든 데이터를 먼저 가져온 다음 날짜를 필터링해야합니다. 날짜가 맞으면 대신 사용하십시오. – Becuzz