По сути, единственная сложная часть в вашем запросе, которую сложно выразить стандартными операторами LINQ to Objects, - это группирование элементов на основе того, насколько близко последовательных друг к другу.
Для этого я бы использовал блок итератора:
// Needs argument-checking, but you'll need another method to do it eagerly.
public static IEnumerable<List<T>> GroupByConsective<T>
(this IEnumerable<T> source, Func<T, T, bool> prevNextPredicate)
{
var currentGroup = new List<T>();
foreach (var item in source)
{
if (!currentGroup.Any() || prevNextPredicate(currentGroup.Last(), item))
currentGroup.Add(item); // Append: empty group or nearby elements.
else
{
// The group is done: yield it out
// and create a fresh group with the item.
yield return currentGroup;
currentGroup = new List<T> { item };
}
}
// If the group still has items once the source is fully consumed,
// we need to yield it out.
if(currentGroup.Any())
yield return currentGroup;
}
Для всего остального (проекция, ограничение числа групп, материализация в коллекцию) стандартный LINQ to Objects будет работать нормально. И так ваш запрос становится:
using (var db = new DbContainer())
{
var groups = db.Table
.Select(row => row.Time)
.GroupByConsecutive((prev, next) => next.Subtract(prev)
.TotalSeconds <= 5)
.Take(count)
.ToList();
// Use groups...
}