2011-12-23 4 views
1

Linq 클래스에는 StartTime 및 FinishTime 속성이 있습니다. FinishTime - StartTime으로 계산되는 클래스에 RunTime 속성을 추가하려고합니다. 내 첫 번째 방법은 GET()에서 계산을 매핑되지 않은 속성으로 추가하고 할 :이 잘 처음 일C# 계산 된 열을 Linq로 매핑

[Table(Name = "Log")] 
public partial class Log 
{ 
... 
    [Column(Name = "Start_Time", DbType = "DateTime NOT NULL")] 
    public DateTime StartTime { get; set; } 

    [Column(Name = "Finish_Time", DbType = "DateTime NOT NULL")] 
    public DateTime FinishTime { get; set; } 

    public int RunTime 
    { 
     get { return ((TimeSpan) (this.FinishTime - this.StartTime)).Seconds; } 
     set { this.RunTime = value; } 
    } 
... 
} 

,하지만 내가있는 OrderBy에 정렬하려면 열을 사용하려고하면, I 다음 오류가 발생합니다 : " 'TestProject.Models.Log.RunTime'멤버에 SQL에 대한 지원되는 변환이 없습니다." 이 속성은 데이터베이스 열에 매핑되지 않으므로 SQL에서 정렬 할 방법이 없습니다.

나의 다음 방법은 (내가 제대로 사용되지 않을 수 있습니다)에 "표현"속성과 그것에게 열을 시도했다 :

[Column(Expression = "DATEDIFF(ss, Start_Time, Finish_Time) AS RunTime")] 
public int RunTime { get; set; } 

하지만이 오류가 발생합니다 : "잘못된 열 이름 '런타임 '. " 다시 말하면 RunTime이라는 이름의 Column이 없기 때문입니다.

현재 작업중인 환경에서 데이터베이스를 변경할 수 없습니다. 이 속성을 내 클래스에 추가하고 정렬 쿼리에 사용하는 방법이 있습니까?

감사합니다.

+2

그냥 참고 - RunTime 속성의 setter가 호출하면 StackOverflow 예외가 발생합니다. 접근자를 가져오고 설정하지 않는 것이 좋습니다. –

+0

입력 해 주셔서 감사합니다. 나는 아직도 C#에 다소 익숙하다. – Paul

답변

3

SQL 측에서 정렬 작업을 수행 할 필요가없는 경우 ToString()을 사용하여 Linq/Queryable 부분 (울타리의 C# 측 실제 목록으로 변환)과 OrderBy on 결과는 원래 열에 따라

(편집)

좋아, 그래서 당신은 단지 그때까지 순서대로 계산을 할 수 있습니까?

IEnumerable<Log> logList = db.Logs.OrderBy(x => x.FinishTime - x.StartTime) 

나는 그 전에 시도하지했지만 그것이 작동하지 않을 이유가 표시되지 않습니다.

+0

나를 이길 ... –

+0

안녕 Mikeb. 당신은 내 문제의 근원에 닿았 어! 페이지 번호가 매겨진 테이블 (jqGrid)의 데이터를 사용하고 있으므로 SQL 측면에서 정렬 작업이 효과적으로 이루어져야합니다. – Paul

+0

그 해결책은 특별한 경우 처리와 함께 작동합니다. jqGrid가 피드를 정렬하기 위해 쿼리를 설정 했으므로이 경우에는 OrderBy 또는 OrderByDescending을 선택하기 위해 특별한 논리를 추가해야합니다. – Paul

관련 문제