#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();