ObjectDataSource 용 LINQ 사용 : TOSHORTTIMESTRING을 사용하여 DATETIME을 변환하는 방법?
-
19-08-2019 - |
문제
ObjectDatasource를 사용하여 비즈니스 클래스에 액세스하고 사용자에게 적합한 출력을 생성하려고합니다. 반품 값은 수업을 설명합니다 (강의실과 교수형에서와 같이 소프트웨어가 아닌 교수형). 수업 시간을 "오전 9시 - 오전 10시"와 같은 범위로 보여주고 싶습니다.
이것은 데이터를 가져 오기 위해 사용하는 LINQ 쿼리입니다.
return classQuery.Select(p => new SelectClassData
{
ClassID = p.ClassID,
Title = p.Title,
StartDate = p.StartDate.ToShortDateString(),
EndDate = p.EndDate.ToShortDateString(),
TimeOfClass =
p.StartDate.ToShortTimeString() + " - " +
p.EndDate.ToShortTimeString()
}).ToList();
보시다시피, 나는 시작 및 종료 날짜의 시작과 끝 시간을 인코딩하지만 잠재적으로 다른 날짜에있을 수 있습니다.
이 코드를 실행하면 다음과 같습니다.
"표현식 'p.enddate.tothorttimestring ()'를 SQL로 번역 할 수 없었으며 그것을 로컬 표현으로 취급 할 수 없었습니다."
나는 결과를 투영하고 있다는 것을 알고 있지만 LINQ에 익숙하지 않기 때문에 투영 후 TOSHORTTIMESTRING에 대한 C# 호출이 일어났다 고 가정했습니다. 누구든지 내가 찾고있는 문자열을 얻는 방법을 알아낼 수 있도록 도와 줄 수 있습니까?
해결책
그 이유는 쿼리가 LINQ에서 SQL에서 사용되기 때문입니다. LINQ에서 SQL은 쿼리를 표현 나무로 취급합니다. 일부 방법에 대해 매핑이 정의되어 있습니다 (예 : Contains
) 그러나 실제로 실행되지 않기 때문에 임의의 방법에서는 작동 할 수 없습니다. 쿼리를 구문 분석하고 SQL Server에 제출합니다. 쿼리와 동등한 것은 데이터베이스 서버에서 SQL 문으로 실행되며 결과가 다시 나타납니다. 문제는 ToShortTimeString()
LINQ에서 SQL에서 동등한 SQL 번역이 없습니다. 여기에 사용 된 트릭은 SQL Server에서 데이터를 가져오고 클라이언트 측에서 메소드를 호출하는 것입니다 (AsEnumerable
이것을 할 것입니다).
return classQuery.Select(p => new { p.ClassID, p.Title, p.StartDate, p.EndDate })
.AsEnumerable()
.Select(p => new SelectClassData {
ClassID = p.ClassID,
Title = p.Title,
StartDate = p.StartDate.ToShortDateString(),
EndDate = p.EndDate.ToShortDateString(),
TimeOfClass = p.StartDate.ToShortTimeString() + " - " + p.EndDate.ToShortTimeString() })
.ToList();
다른 팁
나는 Mehrdad의 대답을 많이 좋아합니다. 그것은 문제를 해결할뿐만 아니라 LINQ에 대해서도 나에게 무언가를 가르쳐줍니다. 고맙습니다!
그래도 나는 그 문제를 계속 두드려서이 질문에 걸려 넘어지는 다른 누군가가 고려하고 싶어하는 경우 여기서 설명 할 다른 접근법을 생각해 냈습니다. 내 LINQ에서 SQL 코드가 이제 다음과 같습니다.
return classQuery.Select(p => new SelectClassData
{
ClassID = p.ClassID,
Title = p.Title,
sDate = p.StartDate,
eDate = p.EndDate
}).ToList();
sdate 및 edate는 이제 문자열 대신 DateTime 객체입니다. "SelectClassData"객체에서는 STARTDATE, ENDDATE 및 TIMEOF CLASS 변수에 대한 액세스에 대한 액세스가 속성 getter를 통과하도록 선언을 변경했습니다.
public class SelectClassData
{
public int ClassID { get; set; }
public string Title { get; set; }
public DateTime sDate { get; set; }
public DateTime eDate { get; set; }
public string StartDate { get { return GetSDate(); } }
public string EndDate { get { return GetEDate(); } }
public string TimeOfClass { get { return GetTimeOfClass(); } }
protected string GetSDate()
{
return sDate.ToShortDateString();
}
protected string GetEDate()
{
return eDate.ToShortDateString();
}
protected string GetTimeOfClass()
{
return sDate.ToShortTimeString() + " - " + eDate.ToShortTimeString();
}
}
즉, linqToSQL을 통해 sdate를 설정하고 편집했지만 "toshorttimestring"및 "toshortdatestring"변환을 수행합니다. ~ 후에 LINQ 검색은 대상 데이터 클래스에서이를 구현하여 검색합니다.