본문 바로가기

IT/Visual Studio

엔티티프레임워크에서 linq 형 변환 방법


엔티티프레임워크(entityframework)에서 객체를 linq로 조회 할 경우 형변환이 필요할 때가 있습니다.

SQL 쿼리는 Convert나 Cast 형식으로 간단하게 변환을 할 수 있는데 linq 형 변환은 좀 다르게 해야합니다.

더구나 객체를 형 변환 할때는 지원하지 않는다는 예외 오류가 발생되기도 하는데요. 


예를 들어 아래와 같은 COST 객체가 있다고 하면.

public partial class COST

{

 public string JUBSU_NUMBER { get; set; } //접수번호(끝에 두자리가 일)

 public string NEXT_MONTH { get; set; } //월 

 public string NEXT_YEAR { get; set; } //년도

  ...

}


var query = from cost in db.COST

                 select cost;


위의 코드는 COST 객체를 조회하는 코드입니다.  여기서 저 위에 3개의 속성을 조합한 일자와 내가 조회하고자 하는 일자(searchdate)를 비교하는 작업을 하고 싶을때 보통은 위의 query 개체를 가지고

query = query.where(p => Convert.ToDateTime(p.NEXT_YEAR + "-" + p.NEXT_MONTH + "-" + p.JUBSU_NUMBER.Substring(4, 2)) >= searchdate);


이렇게 작업을 하게 되는데 , 년도+월+접수번호끝두자리 를 합하여 날짜 문자열을 만들고 날짜형으로 형변환을 하여서 비교를 합니다.


허나 이런 경우 LINQ to Entities에서 'System.DateTime (System.String)'를 인식하지 못한다(linq to entities does not recognize the method 'system.datetime todatetime(system.string)')는 오류메세지를 받게 됩니다. 이것은 심지어 날짜형이 아니라 정수형으로 형변환을 해도 마찬가지로 나오게 되는 오류 입니다.


그래서 권장되는 방법이 List 형식으로 바꾸어 준 뒤에 형 변환을 하라는 의견이 많습니다.


List<COST> querylist = query.ToList().where(p => Convert.ToDateTime(p.NEXT_YEAR + "-" + p.NEXT_MONTH + "-" + p.JUBSU_NUMBER.Substring(4, 2)) >= searchdate);


이렇게 되면 아무런 문제 없이 형변환이 되는것을 볼 수 가 있는데 단점이 개체가 많다면 리스트 형식으로 변환할때 속도가 좀 느릴 수 있습니다. 이것을 개선한 다른 좋은 방법을 알고 계신분은 알려 주시면 감사하겠습니다.