2008-09-22 5 views
2

검색 엔진 스타일 목록에서 눈금보기로 결과를 반환하는 LINQ to SQL 쿼리를 실행하려고합니다.Linq to SQL 그룹화 자식 관계

아래의 단순화 된 예제에서, 부모가 하나의 쿼리 (NAMESOFCHILDREN)에있는 모든 하위 항목을 쉼표로 구분 된 목록으로 채울 수 있습니까?

var family = from p in db.Parents 
      where p.ParentId == Convert.ToInt32(Request.QueryString["parentId"]) 
      join pcl in db.ParentChildLookup on p.ParentId equals pcl.ParentId 
      join c in db.Children on pcl.ChildId equals c.ChildId 
      select new 
      { 
       Family = "Name: " + p.ParentName + "<br />" + 
          "Children: " + NAMESOFCHILDREN? + "<br />" 
      }; 

미리 감사드립니다.

답변

4

조인이 카디널리티를 망칠 것입니다! 부모님 목록이 없습니다!

테스트되지 않은 직접 작성한 코드는 다음과 같습니다. Linq 디자이너에서 관계를 추가하면 관계 속성이 제공됩니다. String.Join은리스트를 정리합니다.

두 가지 선택적 메서드 호출을 추가했습니다.

여기서 ...은 자녀가있는 부모 만 필터링합니다. 나는 문자열에 대해 확신하지 못한다. 빈 배열에 조인의 행동.

ToList은 부모를 메모리에 저장하고 나중에 데이터베이스 호출을 통해 액세스합니다. 이것은 런타임 문자열을 얻는 경우 필요할 수 있습니다. 조인은 SQL 변환기 예외로 지원되지 않습니다. 이 예외는 LINQ가 메서드 호출을 SQL Server에서 이해할 수있는 것으로 변환하려고 시도했음을 의미합니다.

int parentID = Convert.ToInt32(Request.QueryString["parentId"]); 

List<string> result = 
    db.Parents 
    .Where(p => p.ParentId == parentID) 
    //.Where(p => p.ParentChildLookup.Children.Any()) 
    //.ToList() 
    .Select(p => 
    "Name: " + p.ParentName + "<br />" + 
    "Children: " + String.Join(", ", p.ParentChildLookup.Children.Select(c => c.Name).ToArray() + "<br />" 
)).ToList(); 

메모 : 일반적으로 데이터가 마크 업을 위해 올바르게 이스케이프 처리 될 때까지 데이터와 마크 업을 혼합하지 않으려합니다. groupby와 오래 된 질문에 대한 답변을 게시

var family = from p in db.Parents    
    where p.ParentId == Convert.ToInt32(Request.QueryString["parentId"])    
    join pcl in db.ParentChildLookup on p.ParentId equals pcl.ParentId    
    select new    {     
     Family = "Name: " + p.ParentName + "<br />" + string.Join(",",(from c in db.Children where c.ChildId equals pcl.ChildId select c.ChildId.ToString()).ToArray()); 
    }; 
+0

감사합니다. 이 데이터를 다른 방식으로 표시하기로 결정했는데 이것이 올바른 방향으로 나아갔습니다. –

0

. 아래 쿼리는 Northwind에서 쉼표로 구분 된 회사 이름, 주문 개수 및 주문 ID를 생성합니다.

var query = from c in north.Customers 
        join o in north.Orders on c.CustomerID equals o.CustomerID 
        select new { c, o }; 

     var query2 = from q in query 
        group q.o by q.c into g 
        select new { CompanyName = g.Key.CompanyName, 
           orderCount = g.Count(), 
           orders = string.Join(",", g.Select(o => o.OrderID)) } 
        into result 
         orderby result.orderCount descending 
        select result; 
0

:

당신은 다음과 같이 시도 할 수