본문 바로가기

Entity Framework

IEnumerable<T> vs IQueryable<T> Linq

Entity Framework 을 사용하면서 어떤분이 아래와 같이 선언하고 linq식을 만든걸 봤다.
IEnumeralbe<T> a = objectContext.userInfo;
IEnumeralbe<T> b = objectContext.userDetail;

var temp = from item in a join item2 in b on a.userKey = b.userKey
               where a.userId= 'xxxx'
               select item
int count = temp.Count();
쿼리가 생각이 안나 위의 같이 막 짜봤다.

그럼 위의 코드에서 어떤일이 발생할까.
기본적으로 IEnumerable 에서의 쿼리는 메모리상에서의 쿼리를 실행하게 된다. 그러나 어떤 개발자들은 그부분을 이지하지 못해 위와 같이 코딩하고 만단. 위의 결과를 말하자면 미치듯이 userdetail 테이블 의 모든 데이터를 가져온다.
그다음에 userinfo테이블의 데이터들을 가져와 메모리상에서의 조인과 조건문이 반영되어 결과값이 나온다.

아마 위와 같은 구문이 있으면 대부분 outofmemery Exception이 떨어질것같다.

그럼 어떻게 해야할까 상식적으로 우리가 알고 있는 Iqueryable<T>을 쓰면된다.

수정된 코드는 아래와 같다.

IQueryable<T> a = objectContext.userInfo;
IQueryable<T> b = objectContext.userDetail;

var temp = from item in a join item2 in b on a.userKey = b.userKey
where a.userId= 'xxxx'
select item
int count = temp.Count();
나도 잘 모르지만 IQueryable인터페이스를 구현한 구현객체는 linq 쿼리를 sql query로 변환해주는 sql옵티마이저가 있다 맞나? ㅋㅋ

아무튼 개발자들은 위의 두 인터페이스들을 잘 알고 쓰도록하자. 끝