문제

stackoverflow 질문 태그와 같은 태그 테이블을 가정합니다.

Tagid (bigint), QuestionId (bigint), tag (varchar)

LINQ를 사용하여 가장 많이 사용되는 25 개의 태그를 얻는 가장 효율적인 방법은 무엇입니까? SQL에서는 간단한 그룹이 할 것입니다.

SELECT Tag, COUNT(Tag) FROM Tags GROUP BY Tag

나는 작동하는 LINQ를 작성했다.

var groups = from t in DataContext.Tags
             group t by t.Tag into g
             select new { Tag = g.Key, Frequency = g.Count() };
return groups.OrderByDescending(g => g.Frequency).Take(25);

정말? 이거 메가 비버 보스가 아니야? 슬픈 것은 내 태그 개체에 이미 속성을 사용한 경우 모든 태그에 대해 데이터베이스에 다시 확인 해야하는 주파수 속성을 포함하기 때문에 거대한 수의 쿼리를 저장하기 위해이 작업을 수행한다는 것입니다.

그래서 나는이 익명 유형을 구문 분석합니다 태그 개체로 :

groups.OrderByDescending(g => g.Frequency).Take(25).ToList().ForEach(t => tags.Add(new Tag()
{
    Tag = t.Tag,
    Frequency = t.Frequency
}));

나는 LINQ 초보자이며, 이것은 옳지 않은 것 같습니다. 실제로 어떻게했는지 보여주세요.

도움이 되었습니까?

해결책

나는 당신이 그것을 옳다고 확신합니다. 또한 LINQ가 생성하고 DB로 전송하는 SQL은 시작한 SQL처럼 보일 것이므로 조금 더 타이핑하는 동안 데이터베이스는 더 이상 작업을 수행하지 않습니다.

다른 팁

태그 객체를 원한다면 LINQ 쿼리에서 직접 작성하지 않겠습니까?

var groups = from t in DataContext.Tags
             group t by t.Tag into g
             select new Tag() { Tag = g.Key, Frequency = g.Count() };

return groups.OrderByDescending(g => g.Frequency).Take(25);

구문의 장점 형태를 사용하는 경우 코드가 장점이됩니다. 대안은 다음과 같습니다.

List<Tag> result = 
  db.Tags
  .GroupBy(t => t.Tag)
  .Select(g => new {Tag = g.Key, Frequency = g.Count()})
  .OrderByDescending(t => t.Frequency)
  .Take(25)
  .ToList()
  .Select(t => new Tag(){Tag = t.Tag, Frequency = t.Frequency})
  .ToList();

SQL 쿼리가 LINQ 쿼리와 똑같은 일을하지 않는다는 점에서 불공평하다고 생각합니다. 상위 25를 반환하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top