Объединение и проецирование различных типов объектов в один объектC#

Место общения программистов C#
Anonymous
 Объединение и проецирование различных типов объектов в один объект

Сообщение Anonymous »

У меня никогда не было проблемы с рамками сущности при получении простых или сложных сущностей с несколькими. Include (...) //

Код: Выделить всё

.ThenInclude(...)
. Однако на этот раз мне нужно получить несколько различных групп сущностей, которые находятся в отношениях 1: 1 или 1: n в каждой группе. Сам проект разделен на слои контроллера/обслуживания/хранилища.

Код: Выделить всё

public class CombinedCalculationRepository
{
private readonly DbSet
 _plannedCalculations;
private readonly DbSet _updatingCalculations;
private readonly DbSet _eqaulCalculations;

public CombinedCalculationRepository(MyDbContext context) { /* assigning DbSets */ }

public IQueryable GetCombinedCalculations()
{
IQueryable query = GetPlannedCalculations()
.Union(GetUpdatingCalculations())
.Union(GetEqualCalculations());

return query;
}

private IQueryable GetPlannedCalculations()
{
return _plannedCalculations
.Include(p => p.Owners)
.Include(p => p.Submitter)
.Select(p => ToCombinedCalculationDto(p));
}

private IQueryable GetUpdatingCalculations()
{
return _updatingCalculations
.Include(p => p.Owners)
.Include(p => p.Submitter)
.Select(p => ToCombinedCalculationDto(p));
}

private IQueryable GetEqualCalculations()
{
return _eqaulCalculations
.Include(p => p.Owners)
.Include(p => p.Submitter)
.Select(p => ToCombinedCalculationDto(p));
}

private CombinedCalculationDto ToCombinedCalculationDto(PlannedCalculation p) => new CombinedCalculationDto
{
Id = p.Id,
SubmitterName = p.Submitter.Name,
SubmitterId = p.Submitter.Id,
Owners = p.Owners.Select(o => new OwnerDto
{
Name = o.Name,
Id = o.Id
}).ToList(), //I know that .ToList() materializes the query, but I don't know how to avoid it
// and so on for other properties
};

private CombinedCalculationDto ToCombinedCalculationDto(UpdatingCalculation u) => new CombinedCalculationDto
{
//Mapping of common properties (same as in PlannedCalculation)
};

private CombinedCalculationDto ToCombinedCalculationDto(EqualCalculation e) => new CombinedCalculationDto
{
//Mapping of common properties (same as in PlannedCalculation)
};
}
< /code>
Репозиторий затем вводится в службу и используется там: < /p>
public class CalculationService
{
private readonly IPlannedCalculationRepository _plannedCalculationRepository;
private readonly IUpdatingCalculationRepository _updatingCalculationRepository;
private readonly IEqualCalculationRepository _equalCalculationRepository;

private readonly ICombinedCalculationRepository _combinedCalculationRepository;

public List GetCalculations(CalculationType calculationType)
{
switch (calculationType)
{
case CalculationType.Planned:
return _plannedCalculationRepository.GetCalculations();
case CalculationType.Updating:
return _updatingCalculationRepository.GetCalculations();
case CalculationType.Equal:
return _equalCalculationRepository.GetCalculations();

default:
//this path is the problem
return _combinedCalculationRepository.GetCombinedCalculations();
}
}
}
< /code>
Однако, когда я запускаю его и пытаюсь получить данные, я получаю < /p>

system.invalidoperationexception: невозможно перевести операцию установки после применения прогноза клиента. Рассмотрим перемещение операции установки перед последним «SELECT» Call. < /P>
< /blockquote>
Поскольку сущности довольно сложны, мне нужно указать свойства, которые мне интересны. Кроме того, эти свойства являются единственными общими свойствами между 3 группами объектов. < /P>
.GetCombinedCalculations()
вызывается службой, которая отвечает за фильтрацию, сортировку и страницу лиц, поэтому я пытаюсь остаться с iqueryable . Чтобы сохранить его оптимизирован, цель состоит в том, чтобы сделать все это в базе данных, а затем запустить запрос через .tolistasync () .
Я пытался использовать анонимный тип вместо комбинированного калькуляции , а затем он работает, но я не могу представить, как фильтровать/сортировать сортировки ANONINGUS. объекты в Iqueryable, не материализуя запрос?>

Подробнее здесь: https://stackoverflow.com/questions/794 ... gle-object

Вернуться в «C#»