ObjectDataSource 용 LINQ 사용 : TOSHORTTIMESTRING을 사용하여 DATETIME을 변환하는 방법?

StackOverflow https://stackoverflow.com/questions/448890

  •  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 검색은 대상 데이터 클래스에서이를 구현하여 검색합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top