Я не думаю, что код Пейдж Кук будет работать так, как показано.
Я включил измененную версию кода, которая должна работать взамен:
public TEntity GetById(Guid id, params Expression<Func<TEntity, object>>[] includeProperties)
{
if (id == Guid.Empty) return null;
IQueryable<TEntity> set = _unitOfWork.CreateSet<TEntity>();
foreach(var includeProperty in includeProperties)
{
set = set.Include(includeProperty);
}
return set.First(i => i.Id == id);
}
Я только заметил это, отследив SQL, сгенерированный Entity Framework, и понял, что оригинальный код был толькосоздавая иллюзию работы, используя ленивую загрузку для заполнения сущностей, указанных для включения.
Существует на самом деле более краткий синтаксис для применения операторов включения с использованием агрегатного метода LINQ , которыйв сообщении в блоге, связанном с.В моем посте также немного улучшен метод за счет возврата к методу Find, когда не требуется никаких включений, а также показан пример реализации метода «GetAll» с использованием аналогичного синтаксиса.