C# linq как получить свойство из списка предикатов при выполнении условия - PullRequest
0 голосов
/ 06 января 2020

У меня следующий запрос linq

var usersToNotify = trainingUsers.Where(x => delegatesToBeReminded.Any(d => d.UserGuid == x.UserGuid))
                                 .Select(x => new RecipientDetail
                                 {
                                     FullName = x.FullName,
                                     Email = x.Email,
// get property from delegatesToBeReminded
                                 })
                                 .ToList();

В приведенном выше примере у меня есть список пользователей для обучения и делегатов ToBeReminded. я хочу получить соответствующую запись, найденную в trainingusers, и создать собственный тип с полным именем, адресом электронной почты от trainingusers и дополнительным свойством от DelegatesTobeReminded.

Может ли кто-нибудь помочь мне, как это сделать?

Могу ли я использовать что-то вроде этого?

            var x = from tu in trainingUsers
                    join d in delegatesToBeReminded on tu.UserGuid equals d.UserGuid
                    select new RecipientDetail
                    {
                        FullName = tu.FullName,
                        Email = tu.Email,
                        Session = d.Session
                    };

Спасибо

1 Ответ

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

Проще всего было бы использовать объединение, как вы предлагали:

trainingUsers.Join(
    delegatesToBeReminded,
    user => user.UserGuid,
    delegateToBeReminded => delegateToBeReminded.UserGuid,
    (user, delegateToBeReminded) => new RecipientDetail
    {
        FullName = user.FullName,
        Email = user.Email,
        Delegate = delegateToBeReminded,
    });

(или вы можете написать эквивалент в синтаксисе запроса linq, как вы это сделали).

Другой способ - это чтобы переписать это в синтаксисе запроса linq, используя let:

from user in trainingUsers
let delegateToBeReminded = delegatesToBeReminded.FirstOrDefault(d => d.UserGuid == user.UserGuid)
where delegateToBeReminded != null
select new RecipientDetail
{
    FullName = user.FullName,
    Email = user.Email,
    Delegate = delegateToBeReminded,
}

Примечание , что они различаются в зависимости от того, что происходит, если для конкретного пользователя существует более одного делегата. Первый создает новый RecipientDetail объект для каждой пары пользователь / делегат; второй создает RecipientDetail объект для каждого пользователя и выбирает первого делегата.

...