Группировка в Linq для сущностей? - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть 3 переменные:

  • wqReqIds: список идентификаторов
  • псевдонимы: список псевдонимов, которые встречаются в таблице более одного раза (где содержится идентификатор записив wqReqIds)
  • allWqAssociates: список AssociateInfo, wqReqId которого можно найти в списке wqReqIds

Что я хочу сделать: если свойство AssociateInfo Alias ​​можно найти в спискепсевдонимы, я хочу поставить звездочку * перед определенным псевдонимом.

Некомментированный псевдоним - это то место, где я остановился в последний раз, и, как вы можете себе представить, он выдал ошибку.Я как бы ожидал этого, но не знаю, как получить то, что мне нужно, за один раз.Это вообще возможно?

Пожалуйста, смотрите мой код ниже, и спасибо за помощь!

  List<int> wqReqIds = requests.Select(x => x.WorkQueueRequestId).ToList();
  var aliases = db.WorkQueueRequestDetails.Where(w => wqReqIds.Contains(w.WorkQueueRequestId))
                     .GroupBy(x => x.AssociatesHistory.Alias)
                     .Where(g => g.Count() > 1).ToList();


  var allWqAssociates = db.WorkQueueRequestDetails.Where(w => wqReqIds.Contains(w.WorkQueueRequestId))
                     .Select(x => new AssociateInfo
                     {
                         WorkQueueRequestId = x.WorkQueueRequestId,
                         //Alias = x.AssociatesHistory.Alias,
                         Alias = aliases.Where(y => y.Key == x.AssociatesHistory.Alias).Any() 
                              ? "***" + x.AssociatesHistory.Alias 
                              : x.AssociatesHistory.Alias,
                         //Alias = aliases.Contains(x.AssociatesHistory.Alias) 
                              // ? "***" + x.AssociatesHistory.Alias 
                              // : x.AssociatesHistory.Alias,
                         Name = x.AssociatesHistory.FirstName + (x.AssociatesHistory.MiddleInitial == null ? " " : " " + x.AssociatesHistory.MiddleInitial + " ") + x.AssociatesHistory.LastName
                     })
                     .ToList();

1 Ответ

0 голосов
/ 27 февраля 2019

Приведенный ниже LINQ был протестирован и должен работать.Обратите внимание на последнюю переменную, которую мы вызываем ToList перед выбором.Это делается для того, чтобы мы могли использовать другие функции, такие как ToString () и троичный оператор, не пытаясь преобразовать EF.Могут быть некоторые различия в моделях данных, поскольку вы не предоставили.Я также реализовал переопределение ToString для полного имени, которое вы можете увидеть внизу этого ответа.

var wqReqIds = requests.Select(x => x.WorkQueueRequestId).ToList();

var aliases = db.WorkQueueRequestDetails.Where(x => wqReqIds.Contains(x.WorkQueueRequestId))
        .GroupBy(x => x.AssociatesHistory.Alias)
        .Where(x => x.Count() > 1)
        .Select(x => x.Key)
        .ToList();


var allWqAssociates = db.WorkQueueRequestDetails.Where(w => wqReqIds.Contains(w.WorkQueueRequestId))
        .ToList()
        .Select(x => new AssociateInfo
        {
            WorkQueueRequestId = x.WorkQueueRequestId,
            Alias = aliases.Any(y => y == x.AssociatesHistory.Alias)
                ? "***" + x.AssociatesHistory.Alias
                : x.AssociatesHistory.Alias,
            Name = x.AssociatesHistory.ToString()
        });

Модель с реализацией ToString

public class AssociatesHistory
{
    public string Alias { get; set; }
    public string FirstName { get; set; }
    public string MiddleInitial { get; set; }
    public string LastName { get; set; }

    public override string ToString()
    {
        return $"{FirstName} {MiddleInitial} {LastName}";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...