2012-04-12 3 views
4

Linq에서 자주 사용하는 요청 중 하나가 있습니다.Linq : 테이블 /리스트를 매개 변수로 사용하여 요청을 최적화하는 방법은 무엇입니까?

ID 목록 (또는 다른 필드)이 항목 목록에있는 일련의 데이터가 필요합니다. 데이터를로드하는 데 (포함 된) 포함 항목이 많기 때문에 많은 요청입니다.

그래서 예 :

나는 구조의 종류, 사람과 테이블을했습니다 :

Id; Name; Age; ... 

여러 외래 키와 연결된 테이블, 그리고 그로드해야이 표 데이터 : 자동차, 회사, 주소, ...

그리고 지금은 특별한 연령 가진 사람의 모든 데이터를 검색 할 :

List<int> ages = new List<int>(){7,17,27,37,47,57,67,77,87}; 
using (MyDatabaseEntities context = new MyDatabaseEntities()) 
{ 
    return context.Persons.Include("Car").Include("Company").Include("Address") 
       .Where(p=>ages.Contains(p.Age)).ToList(); 
} 

문제는 내가 "나이"목록이 변경되지 않는다는 것을 Linq이 알지 못한다는 인상을 받았고 모든 데이터 (Car, Company, ...)가 포함 된 Person의 전체 목록을 다운로드한다는 인상을 받았습니다. 올바른 나이를 가지고 있으면 모든 결과를 검사합니다.

So.

  1. 맞습니까?
  2. 어떻게 피 하시겠습니까?

답변

2

는이 같은 투사를 사용할 수 있습니다

using (MyDatabaseEntities context = new MyDatabaseEntities()) 
{ 
    return context.Persons 
    .Where(p => ages.Contains(p.Age)) 
    .Select(p => new {p, p.Car, p.Company, p.Address}) 
    .ToList(); 
} 
1
  1. 나는 당신이 잘못 생각 : 당신이 "ToList()"의 호출하기 전에 (쿼리를 '열거'하지 않는 반면에 귀하의 경우), 당신은 아무것도 "donwload"하지 않습니다. 하지만 SQL에서 생성 된 코드는 그다지 좋지 않을 수 있습니다.

당신은 당신의 코드를 디버깅하려고 할 수 있습니다 중 하나 SQL 프로파일, 또는 단순히

var yourQuery = context.Persons.Include("Car").Include("Company").Include("Address") 
       .Where(p=>ages.Contains(p.Age)); 

var HarmQuery = context.Persons 
    .Where(p => ages.Contains(p.Age)) 
    .Select(p => new {p, p.Car, p.Company, p.Address}); 


return yourQuery.ToList(); 

는 "VAR 질의"에 breakpoing을 넣어 및 SQL 생성 참조가 을 복사하고 그것을 시도 귀하의 db 지시문, 그리고 둘 다의 공연을 검사하십시오.

편집 : 투사가 포함되어보다 확실히 더 나은 경우 "연결"개체의 특성 하위 집합 만 당신의 필요 :

.Select(p => new{p, p.Car.Name, p.Company.Id, p.Address.Street, p.Address.StreetNumber) 

당신이 할 수없는 것을 "포함"검색 포함 된 개체의 모든 속성.

관련 문제