2009-10-21 7 views
1

하나의 LINQ 문으로 리팩토링 할 수 있습니까? 나는 그것이 할 수있는 것처럼 느낀다. 그러나 그것 주위에 나의 머리를 감쌀 수 없다. 확장 메서드와 LINQ의 실수는 나에게보기 흉한 것처럼 보입니다.LINQ to SQL 리팩터링 foreach 도움말

은 (데시벨은의 DataContext입니다.) 일관된 스타일

void AddToSeries(Series series, DateTime date) 
{ 
    foreach (var date in db.Ad.Select(ad => ad.DateTime.Date).Distinct()) 
    { 
     var phraseCount = (from pc in db.PhraseCount 
          where pc.DateTime.Date == date 
          select pc.Count).SingleOrDefault(); 

     var adCount = db.Ad.Where(ad => ad.DateTime.Date == date).Count(); 

     series.Add(new KeyValuePair<DateTime, double>(date, adCount)); 
    } 
} 
+0

phraseCount는 무엇을 요청 했습니까? –

답변

5

먼저 리팩토링.

void AddToSeries(Series series, DateTime date) 
{ 
    var dates = db.Ad 
     .Select(ad => ad.DateTime.Date) 
     .Distinct(); 

    foreach (DateTime date in dates) 
    { 
     var phraseCount = db.PhraseCount 
      .Where(pc => pc.DateTime.Date == date) 
      .Select(pc => pc.Count) 
      .SingleOrDefault(); 

     var adCount = db.Ad 
      .Where(ad => ad.DateTime.Date == date) 
      .Count(); 

     series.Add(new KeyValuePair<DateTime, double>(date, adCount)); 
    } 
} 

아하는 :

  • phraseCount이
  • 키는 날짜입니다
  • 사용하지 않는, 값은
  • 여러 데이터베이스 여행이 방법에 대한
  • 날짜 매개 변수를 차단
  • 재미를하지 않습니다 수입니다 foreach 변수로

이제 우리는 담당자 :

void AddToSeries(Series series, DateTime date) 
{ 
    var pairs = db.Ad 
     .GroupBy(ad => ad.DateTime.Date) 
     .Select(g => new {key = g.Key, theCount = g.Count()}); 

    foreach (var x in pairs) 
    { 
     series.Add(new KeyValuePair<DateTime, double>(x.key, x.theCount)); 
    } 
}