2009-06-25 2 views
0

LINQ to Entities에서 복제하려고하는 일부 SQL이 있습니다. 시스템의 다른 엔티티에 대한 DateTime 열과 GPS 위치가있는 테이블이 있습니다. CROSS는 특정 기간 동안 "시간 테이블"을 생성하는 테이블 값 함수의 출력에이 테이블을 조인합니다. 그래서 다음이 교차을 dt_end하는 dt_start에서 생성 된 시간의 각각의 개체에 대한 GPS 위치의 목록을 제공에 가입 된 결과에서생성 된 테이블에 조인을 바꿀 엔티티에 대한 LINQ

WHILE @dt_start <= @dt_end 
    BEGIN 
     INSERT INTO @res (dt) VALUES (@dt_start) 
     SET @dt_start = dateadd(ms, @interval_ms, @dt_start) 
    END -- WHILE 

이 TVF의 코드가 같이 보입니다.

이 기능의 일부를 복제 할 수있는 간단한 테스트에서 내 나이브 시도는 다음과 같이 보입니다 :

 var times = new List<DateTime> {DateTime.Parse("2009-04-04"), 
      DateTime.Parse("2009-04-05")}.AsQueryable(); 
     var query = from gps in Db.GPSDataPointSet 
        from t in times 
        where gps.Driver.Id == 1 && gps.UtcTime <= t 
        group gps by gps.Driver.Id 
        into ggps 
         select ggps.OrderByDescending(gps => gps.Id); 
     var test = query.ToList(); 

을하지만 분명이 작동하지 않습니다 - 나는 당신에게 막연한 아이디어를 줄 수있는 희망에 포함 여기서 내가 성취하려고 노력하는 것의 아무도 LINQ to Entities 쿼리의 TVF 기능을 너무 비효율적으로 복제 할 수있는 방법에 대한 제안을 갖고 있습니까?

+0

왜 작동하지 않습니까? – Timwi

답변

0

start 시간에서 end 시간까지의 날짜 집합을 생성하려면 다음과 같이하십시오.

public static IEnumerable<DateTime> Intervals(DateTime start, 
     DateTime end, int intervalMs) 
{ 
    int number = (int) ((end - start).TotalMilliseconds/intervalMs); 
    return Enumerable.Range(0, number).Select(i => 
     start + TimeSpan.FromMilliseconds(intervalMs * i)); 
} 
관련 문제