LINQ to SQL рефакторинг foreach помощь - PullRequest
1 голос
/ 21 октября 2009

Может ли это быть преобразовано в один оператор LINQ? Я чувствую, что это может быть, но не могу обернуть голову вокруг этого. Неразбериха с методами расширения и LINQ просто кажется мне безобразной.

(дБ - это 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));
    }
}

1 Ответ

5 голосов
/ 21 октября 2009

Первый рефакторинг в едином стиле.

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));
    }
}

Aha:

  • фразаСчет не используется
  • ключ - дата, значение - счетчик
  • несколько поездок в базу данных - это не весело
  • параметр даты для этого метода заблокирован переменной 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));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...