본문 바로가기
.Net

.NET/MVC - LINQ Compare DateTime

by 올엠 2024. 2. 23.
반응형

MVC를 이용할 경우 LINQ 를 이용해서 Database를 조작 하게된다.

일반적으로 조건 쿼리는 Whare 절에 => 구분을 통해 식별하고자 하는 컬럼을 가상화하여 비교하거나 조건을 걸 수 있다.

var data = dbModel.db.Where(p => p.id == item.id).ToList();

그런데 DateTime 같은 경우 다음과 같이 사용하게 되면, 코드상에서는 문제가 없지만 실제 구동시 오류가 발생한다.

var data = dbModel.db.Where(p => p.date >= DateTime.UtcNow.AddDays(-30)).ToList();

위 코드의 오류 내용을 보면, DateTime을 LINQ 안에 직접 선언해서 발생하는 문제로 보인다.

System.NotSupportedException: 

'LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, 

and this method cannot be translated into a store expression.'

이를 변수로 따로 만들어서 다시 지정하면 해결이 가능하다.

DateTime beforedate = DateTime.UtcNow.AddDays(-30)

var data = dbModel.db.Where(p => p.date >= beforedate).ToList();

만약 Database의 값이 String이 아니라면?

오류 내용은 LINQ 저장소식으로 변환이 않된다는 것이다.

이부분도 생각해보면, LINQ는 Database에 질의할 문장이라 할 수 있는데, 아직 조회되지 않을 값을 통해 비교를 해야하기 때문에 오류가 발생하는것이다.

System.NotSupportedException: 

'LINQ to Entities does not recognize the method 'System.DateTime ToDateTime(System.DateTime)' method, 

and this method cannot be translated into a store expression.'

따라서 먼저 ToList 인자를 통해 값을 가져오고, 가져온 값을 Where로 비교하면 된다.

DateTime beforedate = DateTime.UtcNow.AddDays(-30)

var data = dbModel.db.ToList().Where(p => Convert.ToDateTime(p.date) >= beforedate)
반응형