First
Я создал это репозиторий GitHub , для которого требуется только F5, чтобы совершить эту ошибку , поэтому вам будет легко попробовать это. Все ссылки в этом вопросе ведут к этому репо.
Поток кода
В моем контроллере , следующий за кодом выражения , я хочу дать разработчикам внешнего интерфейса возможность включать необходимые им отношения.
// The included tables I want to control from my controller
Expression<Func<CompanyDto, object>>[] includes = { x => x.Employees, x => x.Cars };
var companyDto2 = await service.GetByIdAsync(1, includes).ConfigureAwait(false);
и затем в моем слое обслуживания Я сопоставляю, что dto включает в мою сущность , и отправляю их в хранилище
var entityIncludes = mapper.Map<Expression<Func<Entity, object>>[]>(includes);
var result = await repository.GetByIdAsync(id, entityIncludes).ConfigureAwait(false);
Ошибка
Когда я запускаю выражения включения в моем хранилище , я получаю следующую ошибку.
"Код должен быть недоступен"
Вот два примера вещей, которые я пробовал, которые выдают эту ошибку.
Первая попытка
Это была попытка с введите описание ссылки здесь
var queryableResultWithIncludes = includes
.Aggregate(dbContext.Set<TEntity>().AsQueryable(),
(current, include) => current.Include(include));
// return the result of the query using the specification's criteria expression
var result = queryableResultWithIncludes.AsEnumerable();
// Here we get "Code supposed to be unreachable"
var neverHappens = result .ToList();
Вторая попытка
// Second attempts
if (includes.Length > 0)
{
IQueryable<TEntity> set = includes
.Aggregate<Expression<Func<TEntity, object>>, IQueryable<TEntity>>
(dbContext.Set<TEntity>(), (current, expression) => current.Include(expression));
// Here we also get "Code supposed to be unreachable"
return await set.SingleOrDefaultAsync(s => s.Id == id).ConfigureAwait(false);
}
Резюме
Чего мне не хватает? Я делаю какие-то анти-паттерны? Мне нужен эксперт EF, чтобы сказать мне, пожалуйста: -)