using System.Linq.Expressions; using LiteDB; namespace FileTime.App.Database.LiteDb; public class Queryable : IQueryable { private readonly ILiteQueryable _collection; private int SkipCount { get; init; } private int TakeCount { get; init; } public Queryable(ILiteQueryable collection) { _collection = collection; } public IQueryable Where(Expression> predicate) => new Queryable(_collection.Where(predicate)); public IQueryable OrderBy(Expression> order) => new Queryable(_collection.OrderBy(order)); public IQueryable OrderByDescending(Expression> order) => new Queryable(_collection.OrderByDescending(order)); public IQueryable Skip(int skip) => new Queryable(_collection) {SkipCount = skip}; public IQueryable Take(int take) => new Queryable(_collection) {TakeCount = take}; public IQueryable Include(Expression> selector) => new Queryable(_collection.Include(selector)); private ILiteQueryableResult ApplySkipAndTake(ILiteQueryableResult collection) { if (SkipCount > 0) { collection = collection.Skip(SkipCount); } if (TakeCount > 0) { collection = collection.Limit(TakeCount); } return collection; } public IQueryableResult Select(Expression> selector) => new QueryableResult(ApplySkipAndTake(_collection.Select(selector))); public int Count() => ApplySkipAndTake(_collection).Count(); public bool Exists() => ApplySkipAndTake(_collection).Exists(); public T First() => ApplySkipAndTake(_collection).First(); public T FirstOrDefault() => ApplySkipAndTake(_collection).FirstOrDefault(); public T Single() => ApplySkipAndTake(_collection).Single(); public T SingleOrDefault() => ApplySkipAndTake(_collection).SingleOrDefault(); public IEnumerable ToEnumerable() => ApplySkipAndTake(_collection).ToEnumerable(); public List ToList() => ApplySkipAndTake(_collection).ToList(); public T[] ToArray() => ApplySkipAndTake(_collection).ToArray(); }