Я внедряю шаблон репозитория и позволяю пользователю репозитория фильтровать, проецировать и сортировать данные, чтобы это было возможно, когда это возможно, на уровне базы данных.
Когда пользователь добавляет / обновляет сущности, изменения вносятся в память до тех пор, пока не будет вызван метод Save () единицы работы, где все сущности сохраняются в базе данных.
Это интерфейс для части чтения сущностей в хранилище:
class MyEntity
{
public int ID {get;set;}
public string Name {get;set;}
}
interface IMyEntityRepository
{
IEnumerable<MyEntity> Get<TProjection>(Expression<Func<MyEntity, TProjection>> projection, Expression<Func<MyEntity, object>> sorting);
}
Вопрос в следующем:
Скажем, пользователь хранилища добавляет сущность, а затем пытается извлечь объекты, проецируя и сортируя их:
using (var uow = CreateUnitOfWork())
{
repository.Add(new MyEntity {ID = 1, Name = "Bob"});
var result = repository.Get(projection: entity => entity.ID, sorting: entity => entity.Name);
uow.Save();
}
Таким образом, после добавления () добавленная сущность все еще находится в памяти, поскольку единица работы еще не сохранена.
Теперь пользователь запрашивает сущности, проецируя идентификатор, но сортируя по имени.
Поскольку некоторые из объектов находятся в базе данных, а некоторые находятся в памяти, кажется, мне нужно объединить сортировку в базе данных и сортировку объектов в памяти.
Как я смогу объединить базу данных и объекты в памяти, поскольку данные, извлеченные из базы данных с помощью проекции (только по идентификатору), не включают в себя ключ сортировки (имя)?
Редактировать:
Поэтому я понимаю, что в этом случае объекты, добавленные, но еще не сохраненные, должны игнорироваться реализацией запросов к репозиторию.
Но тот же вопрос все еще остается для сущностей, которые были сохранены, но кэшированы в хранилище. Как выполнить сортировку данных, которые частично кэшированы?