2014-09-11 2 views
2

현재 입력 날짜가 데이터베이스의 타임 스탬프와 같은 주인지 확인하고 싶습니다. 나는 날짜의 주 번호를보고 이것을한다. 정상적으로 작동LINQ 문의 첫 번째 요일 확인

Calendar.GetWeekOfYear(DateTime, ...) 

에있어서,

가 나는를 사용하는 것을 시도하고있다. 내가 LINQ를 사용할 때

그러나, 나는 얻을 :

An exception of type 'System.NotSupportedException' occurred in System.Data.Entity.dll but was not handled in user code 

Additional information: LINQ to Entities [...] 

내 코드 :

var ordersWeek = orders.Where(c => 
       (EntityFunctions.TruncateTime(c.Timestamp).Value.Year == EntityFunctions.TruncateTime(DateTime.Now).Value.Year) && 
       (EntityFunctions.TruncateTime(c.Timestamp).Value.StartOfWeek(DayOfWeek.Monday) == EntityFunctions.TruncateTime(DateTime.Now).Value.StartOfWeek(DayOfWeek.Monday)) 
       ).ToList(); 

나는이 확장 방법을 사용하려고이 특정 코드에서 :

public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek) 
    { 
     int diff = dt.DayOfWeek - startOfWeek; 
     if (diff < 0) 
     { 
      diff += 7; 
     } 

     return dt.AddDays(-1 * diff); 
    } 

무엇이 가장 좋습니까 LINQ에서이 작업을 수행하는 방법은 무엇입니까? .Date 기능을 사용할 수 없음을 기억하십시오.

+0

LINQ는 객체에 LINQ에 비해 상당히 제한된다. LINQ 표현 전체를 게시하십시오. – Dennis

+1

Linq to Entities를 사용하는 경우 이것이 실패하는 이유입니다. 해당 메소드를 SQL로 변환하는 지원되는 방법은 없습니다. SQL 외부의 메서드를 사용해 본 다음 조인하십시오. – paqogomez

+0

LINQ없이 SQL로 어떻게 작성할 수 있습니까? 우선 그 그림을 그린 다음 LINQ에 매핑하는 방법을 찾아야합니다. – Servy

답변

2

확장 메서드 StartOfWeek은 C# 코드에서만 볼 수 있습니다. 엔티티 프레임 워크가 기본 데이터 소스 언어 (가능하면 SQL)으로 변환 할 방법이 없습니다. 마찬가지로 Calendar.GetWeekOfYear을 사용하려고하면 EF가 번역 할 수없는 것과 같은 이유로 실패합니다. 대신

당신은 할 수 있습니다 :

    c.TimeStamp >= StartDate && c.TimeStamp <= EndDate

코드처럼 LINQ 쿼리에 쿼리 범위 당신의 주

  • 사용에 대한
  • 계산 시작 날짜 및 종료 날짜 :

    DateTime startDate = dt.StartOfWeek(DayOfWeek.Monday); 
    DateTime endDate = startDate.AddDays(6); 
    

    연장 방법 :

    당신의 LINQ 쿼리 16,
    public static class MyExtension 
    { 
        public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek) 
        { 
         int diff = dt.DayOfWeek - startOfWeek; 
         if (diff < 0) 
         { 
          diff += 7; 
         } 
    
         return dt.AddDays(-1*diff); 
        } 
    } 
    

    다음 : 엔티티에

    var ordersWeek = orders.Where(c => 
           (EntityFunctions.TruncateTime(c.Timestamp).Value.Year == EntityFunctions.TruncateTime(DateTime.Now).Value.Year) && 
           (EntityFunctions.TruncateTime(c.Timestamp).Value >= startDate && 
           EntityFunctions.TruncateTime(c.Timestamp).Value <= endDate) 
           .ToList(); 
    
  • +0

    문제가있는 것 같습니다. 확장 메소드의 서명에 "this DateTime dt"가 있어야합니다. . 적어도 내 솔루션에서 작동하도록하려면 그렇게해야합니다. 그렇지 않으면 훌륭한 대답입니다. –

    +0

    @SailingJudo, 당신은 절대적으로 옳았습니다. 어쨌든 나는 그것을 놓쳤습니다. 미래에 자신을 직접 편집 해 주셔서 감사합니다. – Habib