2011-03-25 4 views
13

나는 4 개 테이블이 : 포스트, 카테고리, 관계 및 메타LINQ에서 GroupBy를 올바르게 사용하는 방법은 무엇입니까?

category 캔 여러 posts를 포함하고 그들 사이의 관계가 Relation 테이블에 저장됩니다. 게시물은 Meta 테이블에 저장된 많은 추가 정보를 가질 수 있습니다. 카테고리 및 추가 정보가있는 모든 게시물을 나열한 다음 게시물 ID로 그룹화합니다.

나는 다음과 같은 쿼리를

select p.ID, p.Title, t.Name, m.Key, m.Value from Post p 
left join Relation r on p.ID = r.Child 
left join Category c on r.Parent = c.ID 
left join Meta m on p.ID = m.Object 
where m.Type = 'news' 
order by p.ID 

을 가지고 있고 이러한 샘플 데이터로 :

Post 

ID Title 

1  A 

Category 

ID Name 

1  Tips 
2  Tricks 

Meta 

ID Object Key  Value 

1  1  Key1  Value 1 
2  1  Key2  Value 2 

Relation 

ID Child Parent 

1  1  1 
2  1  2 

이 결과는

PostID  Title  Category  Key  Value 

    1   A   Tips   Key1  Value1 
    1   A   Tips   Key2  Value2 
    1   A  Tricks  Key1  Value1 
    1   A  Tricks  Key2  Value2 

될 것이며 나는 결과가

을 것으로 예상
PostID  Title  Categories    Meta 

    1   A  Tips, Tricks Key1=Value1, Key2=Value2 

우리는 EF의 V4와 결과 LINQ to Entities에 SQL에서 쿼리를 변환 할 수 있습니다 궁금는 상관 주시면 감사하겠습니다 도움이

class Result 
{ 
    long ID, 
    string Title, 
    List<string> Categories, 
    Dictionary<string, string> Meta 
} 

같은 클래스에 저장됩니다. 쿼리 에서 기대하는 최종 결과를 무엇

+0

추가 선택을 사용하여 생성 된 SQL은 무엇입니까? 게시하기에 충분히 작은가요? 어떤 데이터베이스/EF 백엔드 - SQL Server? – Rup

+0

SQL 출력을 추가했습니다. Entity Framework 버전 4와 함께 SQL Server를 사용하고 있습니다 – ByulTaeng

+0

즉, 개체 ID를 조회 한 다음 각 개체를로드하는 별도의 쿼리를 수행하는 쿼리를 수행하고 있습니다. -/ – Rup

답변

1

는 개인적으로 생성 된 SQL이 될 것입니다

var q = from r in Relation 
     join p in Post on r.Child equals p.ID 
     join t in Term on r.Parent equals t.ID 
     let x = new { p.ID, p.Title, t.Name } 
     group x by x.ID into g 
     select g; 

내가 (확실하지 않음) 생각이 방법 같은 쿼리를 작성하는 것을 선호 난

+0

답변을 주셔서 감사합니다. 그러나 내가 생각한 바가 아닙니다. 곧 질문을 업데이트하겠습니다 ^^ – ByulTaeng

0

간단 100 % 확신 할 수는 없지만 그룹화하는 경우에는 결과가 결과 집합의 모든 항목별로 그룹화되거나 집계 된 데이터 여야합니다. 여기

var query = from p in Posts 
from r in Relations 
.Where(r => p.ID == r.Child) 
.DefaultIfEmpty() 
from c in Categories 
.Where(c => r.Parent == c.ID) 
.DefaultIfEmpty() 
group p by new {ID = p.ID, Title = p.Title, Name = c.Name} into z 
select new { ID = z.Key.ID, Title = z.Key.Title, Name = z.Key.Name }; 

이 문에 의해 생성 된 SQL입니다 :이 쿼리는 단일 SQL 문 생성, PostId, PostTitle 및 범주에 의해 결과와 그룹을 검색합니다 생성 된 SQL은 다음

SELECT [t3].[ID], [t3].[Title], [t3].[value] AS [Name] 
FROM (
SELECT [t0].[ID], [t0].[Title], [t2].[Name] AS [value] 
FROM [Post] AS [t0] 
LEFT OUTER JOIN [Relation] AS [t1] ON [t0].[ID] = [t1].[Child] 
LEFT OUTER JOIN [Category] AS [t2] ON [t1].[Parent] = [t2].[ID] 
) AS [t3] 
GROUP BY [t3].[ID], [t3].[Title], [t3].[value] 

입니다 원래 문 : 이제 EntityFramework를 사용하고자하고 있다는

SELECT [t0].[ID] AS [Key] 
FROM [Post] AS [t0] 
INNER JOIN [Relation] AS [t1] ON [t0].[ID] = [t1].[Child] 
INNER JOIN [Category] AS [t2] ON [t1].[Parent] = [t2].[ID] 
    GROUP BY [t0].[ID] 
GO 

-- Region Parameters 
DECLARE @x1 Int SET @x1 = 1 
-- EndRegion 
SELECT [t0].[ID], [t0].[Title], [t2].[Name] 
FROM [Post] AS [t0] 
INNER JOIN [Relation] AS [t1] ON [t0].[ID] = [t1].[Child] 
INNER JOIN [Category] AS [t2] ON [t1].[Parent] = [t2].[ID] 
WHERE ((@x1 IS NULL) AND ([t0].[ID] IS NULL)) OR ((@x1 IS NOT NULL) AND   ([t0].[ID]   IS  NOT NULL) AND (@x1 = [t0].[ID])) 
    GO 

-- Region Parameters 
DECLARE @x1 Int SET @x1 = 2 
-- EndRegion 
SELECT [t0].[ID], [t0].[Title], [t2].[Name] 
FROM [Post] AS [t0] 
INNER JOIN [Relation] AS [t1] ON [t0].[ID] = [t1].[Child] 
INNER JOIN [Category] AS [t2] ON [t1].[Parent] = [t2].[ID] 
WHERE ((@x1 IS NULL) AND ([t0].[ID] IS NULL)) OR ((@x1 IS NOT NULL) AND ([t0].[ID] IS  NOT NULL) AND (@x1 = [t0].[ID])) 
+0

감사합니다. 나는 당신의 해결책을 시도 할 것입니다. – ByulTaeng

1

, 당신은 단지 ID와 결과 테이블과 사용자 데이터베이스, edmx를 설정해야하고 제목, 카테고리 및 메타 테이블. 그런 다음 결과 테이블의 일대 다 관계를 각 범주 및 메타 테이블에 추가합니다.

+0

ur 의견을 보내 주셔서 감사합니다.벌써 다 끝냈어. 지금 EF를 사용 중이며이 문제에 대한 해결책을 찾고 있습니다. – ByulTaeng

관련 문제