Добавить список в список Linq C# - PullRequest
1 голос
/ 21 января 2020

У меня есть POCO вроде этого:

public class BatchTypesByNetwork
{
    public Guid BatchTypeId { get; set; }
    public string Name { get; set; }
    public bool CanSchedule { get; set; }
    public string Description { get; set; }
    public Guid? NetworkTypeId { get; set; }
    public string ReportDisplayId { get; set; }

    public IEnumerable<BatchScheduleParameters> ScheduleParameters { get; set; }
}

и

public class BatchScheduleParameters
{
    public Guid BatchTypeId { get; set; }
    public Guid ParameterId { get; set; }
    public string ParameterName { get; set; }
    public string ParameterType { get; set; }
    public string ParameterValue { get; set; }
    public bool IsMultiSelection { get; set; }
}

Я делаю так:

Сначала я получаю все сети BatchTypesByNetwork следующим образом:

    var allBatchTypes = await query.Join(_networkTypesRepository, bt => bt.NetworkTypeId, nt => nt.Id, (bt, nt) => new {bt, nt})
                                        .Where(m => m.nt.Name == convertToString(networkType))
                                        .Select(m => 
                                                new BATCH.BatchTypesByNetwork
                                                {
                                                   BatchTypeId = m.bt.Id,
                                                   Name = m.bt.Name,
                                                   CanSchedule = m.bt.CanSchedule,
                                                   Description = m.bt.Description,
                                                   NetworkTypeId = m.bt.NetworkTypeId,
                                                   ReportDisplayId = m.bt.ReportDisplayId
                                               }).AsNoTracking().ToListAsync(serviceContext.CancellationToken);

Затем я l oop через batchTypes, подобный этому, и назначаю список BatchScheduleParameters отдельному batchType

        foreach (var batchType in allBatchTypes)
        {
            var allScheduleParameters = await (from bp in _batchParametersRepository
                                               join bt in _batchParameterTypesRepository
                                               on bp.BatchParameterTypeId equals bt.Id
                                               where bp.IsRequired == true
                                               && bp.BatchTypeId == batchType.BatchTypeId

                                               select new BATCH.BatchScheduleParameters
                                               {
                                                   BatchTypeId = bt.Id,
                                                   ParameterId = bp.BatchParameterTypeId,
                                                   ParameterName = bp.Name,
                                                   ParameterType = bt.Name,
                                                   IsMultiSelection = bp.AllowMultipleSelection == true ? true : false,
                                               }
                                       ).AsNoTracking().ToListAsync(serviceContext.CancellationToken);

            batchType.ScheduleParameters = allScheduleParameters;
        }

Возможно ли сделать это в одном запросе без для l oop .

1 Ответ

2 голосов
/ 21 января 2020

Как предложил @Fabio в своем комментарии, установите отношение один-ко-многим между BatchTypesByNetwork и BatchScheduleParameters (используя Fluent API, аннотации данных или соглашения EF), чтобы вы могли воспользоваться

.Include(i => i.ScheduleParameters)

при запросе к _networkTypesRepository.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...