저는 지난 6 개월 동안 EF 3.5로이 제한과 싸우며 보냈고 제가 세상에서 가장 똑똑한 사람은 아니지만이 주제에 대해 유용한 정보를 제공 할 것이라고 확신합니다.
50 마일 높이의 "OR 스타일"식 트리를 늘려서 생성 된 SQL은 쿼리 실행 계획이 좋지 않습니다. 나는 수백만 개의 행을 다루고 있으며 그 영향은 상당합니다.
ID로 많은 엔티티를 찾는 경우 도움이되는 SQL 'in'을 수행하는 약간의 해킹이 있습니다.
private IEnumerable<Entity1> getByIds(IEnumerable<int> ids)
{
string idList = string.Join(",", ids.ToList().ConvertAll<string>(id => id.ToString()).ToArray());
return dbContext.Entity1.Where("it.pkIDColumn IN {" + idList + "}");
}
여기서 pkIDColumn은 Entity1 테이블의 기본 키 ID 열 이름입니다.
그러나 계속 읽으십시오!
이것은 괜찮지 만 내가 찾아야 할 ID가 이미 있어야합니다. 때로는 내 표현이 다른 관계에 도달하기를 원하며 내가 가진 것은 연결된 관계의 기준입니다.
시간이 더 있다면 이것을 시각적으로 표현하려고하지만 잠시만이 문장을 공부하지 않습니다. Person, GovernmentId 및 GovernmentIdType 테이블이있는 스키마를 고려하십시오. Andrew Tappert (Person)에는 두 개의 ID 카드 (GovernmentId)가 있는데, 하나는 Oregon (GovernmentIdType)이고 다른 하나는 Washington (GovernmentIdType)입니다.
이제 그것으로부터 edmx를 생성하십시오.
이제 특정 ID 값 (예 : 1234567)을 가진 모든 사람을 찾고 싶다고 상상해보십시오.
이것은 다음과 같이 단일 데이터베이스 적중으로 수행 할 수 있습니다.
dbContext context = new dbContext();
string idValue = "1234567";
Expression<Func<Person,bool>> expr =
person => person.GovernmentID.Any(gid => gid.gi_value.Contains(idValue));
IEnumerable<Person> people = context.Person.AsQueryable().Where(expr);
여기에 하위 쿼리가 표시됩니까? 생성 된 SQL은 하위 쿼리 대신 '조인'을 사용하지만 효과는 동일합니다. 요즘 SQL 서버는 어쨌든 커버 아래에서 조인으로 하위 쿼리를 최적화하지만 어쨌든 ...
이 작업의 핵심은 표현식 내부의 .Any입니다.