2012-08-01 1 views
2

신경 쓰지 마세요. 대신 join/into 구문으로 해결했습니다. 아마도 결국 필요합니다.EF에서 외부 조인을 사용할 수 없습니다.

EntitiyFramework와 작동하도록 Linq 외부 조인을 얻으려고합니다.

public List<OSCDagbokDTO> FillDataForOSCDagbokSO(List<OSCDagbokDTO> oscdagboklista) 
{ 
    var kalla_idn = oscdagboklista.Select(k => k.Kalla_id.GetGuidOrNull()).Distinct().ToList(); 
    var kallaLista = (from k in _gemensamEntityContext.Kalla 
         where kalla_idn.Contains(k.Kalla_id) 
         select new KallaDTO() 
         { 
          Kalla_id = k.Kalla_id, 
          KallaText = k.KallaText 
         }).ToList(); 

    var nyOSCDagbokLista = (from o in oscdagboklista 
          from k in kallaLista.DefaultIfEmpty() 
          where o.Kalla_id.GetGuidOrNull() == k.Kalla_id 
          select new OSCDagbokDTO() 
          { 
           Id = o.id, 
           Datum = o.Datum, 
           Enhet_id = o.Enhet_id, 
           Handelse = o.Handelse, 
           Kalla = k, 
           Kalla_id = o.Kalla_id, 
          }).ToList(); 
    return nyOSCDagbokLista; 
} 

첫 번째 문장은 들어오는 목록의 특정 빈에서 ID 목록을 가져옵니다.

둘째, 해당 목록에서 DTO 개체를 만듭니다.

셋째, 들어오는 목록에서 모든 항목을 가져 오기 위해 외부 조인을 사용하여 DTO 목록 (kallaLista)에 가입합니다. DefaultIfEmpty()를 사용하고 있는데, 들어오는 목록의 항목을 필터링하지 않을 것이라고 생각했습니다.

여러 사이트에서 이해 했으므로 "조인"구문을 사용하지 않습니다. 위의 구문이 좋을 것입니다. 이전 구식이지만 더 좋아합니다.

무엇이 누락 되었습니까? DefaultIfEmpty()를 사용할 때 들어오는 목록의 항목이 DTO 목록에 없을 때 필터링되는 이유는 무엇입니까?

답변

1

부모 엔티티에서 하위 컬렉션까지 탐색 속성이있는 경우 외부 조인을 수행하는 매우 간결한 방법이 있습니까?

네비게이션 속성 kallaLista을 사용하여 엔티티 OSCDagbok (단 하나의 형식을 추측하고 있음)이 있다고 가정합니다. 그런 다음 할 수 있습니다.

from o in oscdagboklista 
from k in o.kallaLista.DefaultIfEmpty() // mind the "o." 
select new OSCDagbokDTO() 
... 

그렇지 않은 경우 해결책을 찾을 수 있습니다. intojoin을 외부 결합과 동일한 linq 인 GroupJoin으로 바꿉니다.

+0

나는 그것이 "o"를 사용하지 않고 놓친 것이라고 생각합니다. 하지만 다른 목록 대신! – kaze