2014-01-31 2 views
1

의 개수에 의해 부모 행 순서를 선택하는 가장 좋은 방법은 내가 다음과 같이 댓글에 대한 테이블을 가지고있다 : 나는 응답의 수에 따라 페이징 인기있는 주석을 선택하기 위해 다음 쿼리를 사용하고Linq에 아동

Comment{ 
ID, 
Text, 
ParentID 
} 

.

var comments = db.Comments 
.OrderByDescending(c => db.Comments.Count(r => r.ParentID == c.ID)).Skip(skip).Take(recordsPerPage).ToList(); 

수천 개의 의견이있을 때이 상황을 처리하는 가장 좋은 방법을 알려주십시오.

+1

답장 수를 저장하는'Comment'에 여분의 열을 추가 하시겠습니까? –

+1

주문을하기 전에 건너 뛰고 있다고 생각합니다. 잘못된 결과를 줄 수 있습니다. – drw85

+0

@ drw8 당신이 맞을지도 모릅니다. 내 원래 코드가 그런지 여부를 알 수 있습니다. – user3219798

답변

2

답 개수를 저장하는 Comment에 추가 열을 추가하는 것이 좋습니다. 대신 중첩 된 쿼리를 작성하면 회신 횟수에 따라 Comments을 쉽게 주문할 수 있습니다. 데이터베이스에이 사전 계산을 준비하지 않는 한

var comments = db.Comments.Skip(skip).Take(recordsPerPage) 
       .OrderByDescending(c => c.ReplyCount) 
       .ToList(); 
+0

나는 열을 추가하는 것을 고려해 봤지만 회신이 검토되거나, 플래그가 지정되거나 삭제 될 때마다 ReplyCount를 다시 계산해야합니다. 다시 한번 일종의 오버 헤드이므로 linq을 사용하는 것이 가장 좋은 방법인지 생각하고있었습니다. – user3219798

+0

나는 이해하지만 오버 헤드가되어서는 안된다. 회신이 검토되거나, 플래그가 지정되거나 삭제 될 때마다 한 번의 회신 회신 계산 만 업데이트하면된다. 나는 당신의 현재 상황에 비해 합리적이라고 생각한다. –

+0

나는 내가 할 것이라고 생각한다. 누군가가 더 나은 & 쉬운 접근을 게시하지 않는 한 지금은 ReplyCount. – user3219798

1

당신은 당신이 중첩 된 쿼리를 수행하거나 또는 하나의 전체가 메모리에 다음 모든 일을 인출해야 할 문제가있다. 후자는 너무 느린 것으로 입증 될 때까지 내 선택입니다.

처음에는 어떻게 했는가?

첫째, 프리 페치 :

: 결과를 반환 지금은 거의 사소한

var childrenLookup = allComments.ToLookup(x => x.ParentID); 
var parentMap = allComments.ToDictionary(x => x.ID, x => x.ParentID); 

Func<int, int> getCommentsCount = n => 
{ 
    var r = 0; 
    if (parentMap.ContainsKey(n)) 
    { 
     r = childrenLookup[parentMap[n]].Count(); 
    } 
    return r; 
}; 

:

var allComments = Comments.ToArray(); 

가 신속하게 의견의 수를 반환하는 함수를 작성

var comments = allComments 
    .OrderByDescending(c => getCommentsCount(c.ID)) 
    .Skip(skip) 
    .Take(recordsPerPage) 
    .ToList(); 

(그렇습니다. 주문을 건너 뛰고 페이징하기 위해 잘못된 순서로 진행됩니다.)

메모리에서이 작업을 수행 할 수없는 경우 사전 계산 방식으로 이동하십시오.

+0

답장을 보내 주셔서 감사합니다.이 프로젝트에 대해 사전 계산할 것이지만 반드시이 접근법을 고려해야합니다. 감사!! – user3219798