2010-12-23 2 views
0

다음과 같이 linq2sql을 수행하려고하는데 성공하지 못했습니다.linq2sql은 "multiselect"와 결합했습니다.

회원 및 참조 테이블이 있습니다. DB는 회원이 여러 개의 (> = 0) References를 가질 수있는 방식으로 디자인되어 있습니다. 쿼리의 결과로 원하는 것은 멤버의 list (행)이며, 멤버의 모든 참조는 하나의 열에 "수집"됩니다.

달성 한 것은 다음과 같은 쿼리입니다. 그러나 여기에는 각 참조에 대한 행이 있습니다.

var refs = (from m in db.Members 
        join 
         r in db.References on m.PID equals r.PID into g 
        from o in g.DefaultIfEmpty() 
        select new 
        { 
         member = m, 
         name = (o == null ? "" : o.NameSurname) 
        }); 

은 내가 SelectMany의 somewher :

당신이 목표를 달성에 대한 힌트를 전해 주 시겠어요을 삽입해야 기분이?

답변

0

당신은 다음과 같은 의미합니까 :

var refs = from m in db.Members 
      join r in db.References on m.PID equals r.PID into j 
      from o in j.DefaultIfEmpty() 
      select new { Member = m, Reference = o } into results 
      group result by result.Member into g 
      select g; 

그 그룹 멤버 모든 결과 (그룹의 키)하고 (해당 키와 일치하는 결과)와 관련된 모든 참조 것.

당신은 아마 그냥 ORM에서 관계를 설정 좋을 것하지만 당신은 너무 같은 (아마도 이름) member.References 속성을 참조 할 수 있습니다 :

foreach(var member in db.Members) 
{ 
    var allReferences = member.References; 
} 
+0

쿼리 후 Name-Surname에 액세스 할 수 있으므로 첫 번째 쿼리가 작동하지 않습니다. 두 번째 것은 각 구성원에 대한 References 테이블을 쿼리하기 때문에 계산적으로 실행 가능하지 않습니다. 나는 약 6M 멤버와 4M 레퍼런스를 가지고있다 - 최악의 경우 4M 행 데이터를 6M 번 쿼리하는 것을 의미한다. – oop123123

1
var refs = (from m in db.Members 
         select new 
         { 
          member = m, 
          name = String.Join(",",(from r in db.References on m.PID equals r.PID into g 
         from o in g.DefaultIfEmpty() select o.NameSurname).toArray()) 
         }).Distinct(); 

이 안된하지만, 나는 이것이 당신이 찾고있는 것이라고 생각합니다. 그것은 당신의 회원을 움켜 잡고 모든 참조가 이름으로 합류하도록해야합니다. 작동하지 않는 경우 알려 주시면 자세히 살펴 보겠습니다.

+0

위의 join 문은 작동하지 않습니다. 같은 아이디어를 사용하여 쿼리를 만들려고 시도하고 "name"을 얻기 위해 쿼리를 변경했습니다. name = String.Join (",", db.References.Where (r => r.PID == m.PID) .Select (r => r.AdSoyad) .ToArray()) 다시 말해서 References 테이블에서 각 멤버를 쿼리합니다. 나는 약 6M 멤버와 4M 레퍼런스를 가지고있다 - 최악의 경우 4M 행 데이터를 6M 번 쿼리하는 것을 의미한다. – oop123123

관련 문제