2014-11-07 4 views
0

в проекте mvc Я использую этот метод. Однако, когда база данных становится все больше и больше, она идет очень медленно. Как я могу это решить?Linq groupby проблема с производительностью

private List<SelectListItem> getDates() { 
     var db = new _Entities(); 
     var list = new List<SelectListItem>(); 

     var date = db.Location 
        .GroupBy(k => EntityFunctions.TruncateTime(k.DateServer)) 
        .ToList(); 
     //var date = db.Location.Select(m => m.DateService).Distinct(); 
     foreach (var x in date) 
     { 
      list.Add(
       new SelectListItem 
       { 
       Value = x.FirstOrDefault().DateServer.Date.ToShortDateString(), 
       Text = x.FirstOrDefault().DateServer.ToShortDateString() 
       }); 
     } 
     return list; 
    } 
+0

Кстати, текст и значение совпадают, так как вы группируете по дате. –

+1

Возможно, вам нужно посмотреть, какой запрос выдает, созданный любым решением. Исходя из того, что вашей базе данных может понадобиться индекс. –

+0

Вы действительно хотите больше времени для группировки данных. Если вы не допустили ошибку начинающего (отсутствующий индекс - jikes) - это факт. Итак, фокус в том, чтобы отфильтровать данные перед группой. Или получить лучшее оборудование. Или кеш приводит к памяти. – TomTom

ответ

1

Вы не должны создать список и цикл, но использовать базу данных:

return db.Location.GroupBy(k => EntityFunctions.TruncateTime(k.DateServer)) 
    .Select(group => new { group, first = group.First() }) 
    .Select(x => new SelectListItem { 
     Value = x.first.DateServer.Date.ToShortDateString(), 
     Text = x.first.DateServer.ToShortDateString() 
    }) 
    .ToList(); 

Поскольку вы группирование по дате текст и значения одинаковы, так что это может быть упрощена:

return db.Location.GroupBy(k => EntityFunctions.TruncateTime(k.DateServer)) 
    .Select(g => new SelectListItem { Value = g.Key.ToShortDateString(), Value = g.Key.ToShortDateString() }) 
    .ToList(); 
Смежные вопросы