Выберите из нескольких списков

#c# #linq #.net-core

#c# #linq #.net-ядро

Вопрос:

У меня есть следующий запрос Linq:

     var identities = message.Events
        .Where(x => x.EventType == eventType)
        .Where(x => x.Roles?.Any(y => y.RoleId == 42) == true)
        .SelectMany(x => x.Roles, (parent, child) =>
            new
            {
                parent.Id,
                child.CustomerName,
                child.CustomerNumber,
                child.RegionId

            })
        .Select(x =>
            new AuditFirmEmployeeCrud(x.CustomerName, x.CustomerNumber.Value, x.RegionId, x.GlobalId));
 

В списке событий у меня есть еще один список, IEnumerable, из которого я также хочу получить данные:

   public class MetaData
  {
    string Key { get; set; }

    string Source { get; set; }

    string Value { get; set; }
  }
 

Но я не знаю, как выбрать из нескольких списков. Я хотел бы попытаться каким-то образом объединить SelectMany для x.Ролей и x.Метаданных.

Вот списки:

 public class EventList
{
    Event[] Events {get; set;}
}

public class Event
{
    EventType Type {get; set;}
    Guid Id {get; set;}
    IEnumerable<Accounts>? Accounts { get; set; }

    IEnumerable<MetaData>? Metadata { get; set; } // This i want to combine as well, and get the value of the Key and Value property

    IEnumerable<Roles>? Roles { get; set; } // This I already got
}
 

Итак, в принципе, я хочу переписать это в Linq:

     foreach (var eventRow in message.Events)
    {
        if (eventRow.EventType == someEvent)
        {
            var Id = eventRow.GlobalId;
            var customerNumber = eventRow.Roles.Where(x => x.RoleId == 42).Select(x => x.CustomerNumber).FirstOrDefault();
            var regionId = eventRow.Roles.Select(x => x.RegionId).FirstOrDefault();
            var customerName = eventRow.Metadata.Select(x => x.Key   " "   x.Value).FirstOrDefault();

            var crudObj = new AuditFirmEmployeeCrud(customerName, customerNumber.Value, regionId, Id);
        }
    }
 

Комментарии:

1. @ThomasWeller: Да? Посмотрите в моем вопросе, как определяется класс метаданных. Это три свойства в классе метаданных, и я хочу получить значение свойства Value и свойства Key.

2. Очевидно, я этого не понимаю. Я ухожу

3. @ThomasWeller: проверьте мой обновленный вопрос еще раз. 🙂

4. .FirstOrDefault() — Это делает его просто 1 значением вместо списка

5. @ThomasWeller я сдаюсь. Я выхожу.

Ответ №1:

Не уверен, понимаю ли я, в чем проблема. Ваш вопрос сбивает с толку, потому что запрос LINQ в начале вашего вопроса имеет мало общего с тем, что вы делаете в цикле foreach в конце вопроса.

Вы действительно просто хотите преобразовать цикл foreach в LINQ? Если да, то это довольно просто:

 var identities = message.Events
    .Where(eventRow => eventRow.EventType == someEvent)
    .Select(eventRow => new
    {
        Id = eventRow.GlobalId,
        CustomerNumber = eventRow.Roles
            .Where(x => x.RoleId == 42)
            .Select(x => x.CustomerNumber)
            .FirstOrDefault(),
        RegionId = eventRow.Roles
            .Select(x => x.RegionId)
            .FirstOrDefault(),
        CustomerName = eventRow.Metadata
            .Select(x => x.Key   " "   x.Value)
            .FirstOrDefault()
    })
    .Select(x => new AuditFirmEmployeeCrud(x.CustomerName, x.CustomerNumber.Value, x.RegionId, x.Id))
    .ToArray();