programing tip

2 개의 날짜를 빼기위한 LINQ to Entities

itbloger 2020. 12. 10. 19:08
반응형

2 개의 날짜를 빼기위한 LINQ to Entities


Entity Framework에서 LINQ를 사용하여 두 날짜 사이의 일 수를 확인하려고합니다. System.TimeSpan 클래스에서 빼기를 인식하지 못한다고 말합니다.

다음은 LINQ 쿼리의 where 부분입니다.

where ((DateTime.Now.Subtract(vid.CreatedDate).TotalDays < maxAgeInDays))

다음은 VS.NET 디버거에서받은 오류입니다.

{ "LINQ to Entities는 'System.TimeSpan Subtract (System.DateTime)'메서드를 인식하지 못합니다.이 메서드는 저장소 식으로 변환 할 수 없습니다."}

내가 뭔가 잘못하고 있거나 엔티티 프레임 워크에서 2 DateTimes 사이의 일 수를 얻는 더 좋은 방법이 있습니까?

감사합니다 마이클


이 경우 허용되는 대답이 더 좋지만 참조를 위해 EntityFunctions클래스를 사용하여 날짜 작업을 수행 할 수 있습니다 .

where (vid.CreatedDate >= EntityFunctions.AddDays(DateTime.Now, -maxAgeInDay))

다음은 내가 작동하는 방법입니다.

가장 오래된 날짜를 나타내는 datetime 변수를 정의했습니다.

DateTime oldestDate = DateTime.Now.Subtract(new TimeSpan(maxAgeInDays, 0, 0, 0, 0));
...

그런 다음 LINQ 쿼리의 where 부분을 수정했습니다.

where (vid.CreatedDate >= oldestDate )

매력처럼 작동했습니다. 표현 트리에 대해 생각하게 해준 Micah에게 감사드립니다.


다음을 사용할 수도 있습니다 System.Data.Objects.EntityFucntions.

currentDate = DateTime.Now;

...
where  EntityFunctions.DiffDays(currentDate, vid.CreatedDate) < maxAgeIdDays 

의 모든 함수는 EntityFunctionsLinq- 엔터티 전용이며 SQL 함수에 매핑됩니다.


술어를 표현식 트리로 변환해야하기 때문에 이러한 종류의 isses가 발생합니다. 그리고 번역 과정에서 DateTime.Now.Subtract 메서드를 인식하지 못합니다.


사실 LINQ to Entities는 의도적으로 전체 쿼리를 SQL 문으로 변환해야합니다. 그것이 Subtract 방법을 인식 할 수없는 곳입니다. 쿼리 내에서 C # / VB 메서드를 사용하려고 할 때마다 발생합니다. 이 경우 쿼리에서 해당 부분을 가져 오는 방법을 찾아야합니다. 이 게시물은 좀 더 설명합니다 : http://mosesofegypt.net/post/LINQ-to-Entities-what-is-not-supported.aspx


모델에서 새 속성을 정의 할 수 있습니다.

    public DateTime StartDate{ get; set; }
    public DateTime EndDate{ get; set; }
    public TimeSpan CalculateTime{
        get
        {
            return EndDate.Subtract(StartDate);
        }
    }

이제 다음과 같이 사용할 수 있습니다.

var query = from temp in db.Table
select new MyModel {
    Id = temp.Id,
    Variable1 = temp.Variable1,
    ...
    EndDate = temp.EndDate,
    StartDate = temp.StartDate
}

결과를 볼 때 다음과 같은 반환을 사용할 수 있습니다.

return query

이제 쿼리에는 CalculateTime이 있습니다 (EndDate와 Startdate 사이에서 빼기).

참고 URL : https://stackoverflow.com/questions/570858/linq-to-entities-for-subtracting-2-dates

반응형