在 Linq 中分组到实体?

Grouping in Linq to Entities?

我有 3 个变量:

我想做的:如果在别名列表中可以找到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();

下面的 LINQ 已经过测试,应该可以工作。请注意我们在 select 之前调用 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}";
    }
}