[c#] Linq에서 EntityFramework DateTime으로

내 응용 프로그램에서 Entity Framework를 사용하고 있습니다.

내 테이블

-Article
-period
-startDate

일치하는 레코드가 필요합니다 => DateTime.Now > startDate and (startDate + period) > DateTime.Now

이 코드를 시도했지만 이제 작동합니다.

Context.Article
    .Where(p => p.StartDate < DateTime.Now)
    .Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now)

내 코드를 실행할 때 다음 예외가 발생합니다.

LINQ to Entities는 ‘System.DateTime AddDays (Double)’메서드를 인식하지 않으며이 메서드는 저장소 식으로 변환 할 수 없습니다.



답변

LINQ to Entity Framework를 사용하는 경우 Where 절 내의 조건자가 SQL로 변환됩니다. DateTime.Add()의미 가 있는 SQL 로의 번역이 없기 때문에 오류가 발생합니다 .

빠른 해결 방법은 첫 번째 Where 문의 결과를 메모리로 읽은 다음 LINQ to Objects를 사용하여 필터링을 완료하는 것입니다.

Context.Article.Where(p => p.StartDate < DateTime.Now)
               .ToList()
               .Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now);

.NET 4.0을 사용하는 경우 EntityFunctions.AddDays 메서드를 사용해 볼 수도 있습니다 .

Context.Article.Where(p => p.StartDate < DateTime.Now)
               .Where(p => EntityFunctions.AddDays(p.StartDate, p.Period)
                   > DateTime.Now);

참고 : EF 6현재 System.Data.Entity.DbFunctions.AddDays.


답변

나는 이것이 마지막 대답이 제안하려고 한 것이라고 생각하지만 p.startdat (sql 문으로 변환 할 수없는 것)에 날을 추가하려고하기보다는 sql과 동일 할 수있는 일을하지 않는 이유는 무엇입니까?

var baselineDate = DateTime.Now.AddHours(-24);

something.Where(p => p.startdate >= baselineDate)


답변

DateTime에서 2 일을 빼는 방법은 다음과 같습니다.

Context.Article
.Where(p => p.StartDate < DateTime.Now)
.Where(p => p.StartDate > DateTime.Now.Subtract(new TimeSpan(2, 0, 0, 0)))

솔직히 말해서 당신이 무엇을 성취하려고하는지 잘 모르겠지만이게 효과가있을 수 있습니다


답변

표현식을 SQL로 변환해야하는 경우 다음을 사용할 수 있습니다.

System.Data.Entity.Core.Objects.AddDays 메서드.

실제로 사용되지 않는 것으로 표시되지만 작동합니다. System.Data.Entity.DbFunctions.AddDays로 바꿔야하지만 찾을 수 없습니다 …


답변