Настройка
public abstract class Entity
{
public Guid Id { get; set; }//Primary key
public int Version { get; set; }//Primary key
public DateTime Created { get; set; }
public User CreatedBy { get; set; }
public bool IsDeleted { get; set; }
}
И Id, и Version являются первичным ключом.
Сущность автоматически генерирует Id при создании и имеет версию по умолчанию «0». Когда сущности обновляются, добавляется другая запись с тем же Id и версией «1» и т. Д. Когда сущность «удаляется», добавляется другая запись с тем же Id, версией + 1 и свойством IsDeleted, установленным в « правда».
Вопрос
В моем репозитории я хочу иметь метод, который возвращает запрашиваемое значение
- Объекты, сгруппированные по одному идентификатору
- Самая высокая версия (= последняя версия
субъекта)
- IsDeleted = false
Итак, вкратце: я хочу получить список сущностей, только с их последней записью (когда для сущности не установлено значение "IsDeleted")
Попытка
Я пробовал 2 разных способа решить эту проблему. Какой из них правильный / лучше здесь? (или другие предложения?)
Вариант 1:
public IQueryable<TEntity> Get<TEntity>(int page, int size) where TEntity : Entity
{
return _context
.Query<TEntity>()
.OrderByDescending(x => x.Version)
.GroupBy(x => x.Id)
.SelectMany(x => x)
.Where(x => !x.IsDeleted)
.Skip(page * size)
.Take(size);
}
Вариант 2:
public IQueryable<TEntity> Get<TEntity>(int page, int size) where TEntity : Entity
{
return _context
.Query<TEntity>()
.GroupBy(d => d.Id)
.Select(g => g.OrderByDescending(d => d.Version))
.OrderByDescending(e => e.First().Version)
.SelectMany(e => e)
.Where(x => !x.IsDeleted)
.Skip(page * size)
.Take(size);
}