在 Linq 中分组到实体?
Grouping in Linq to Entities?
我有 3 个变量:
- wqReqIds:Id 列表
- 别名:在 table 中多次出现的别名列表(其中记录 ID 包含在 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();
下面的 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}";
}
}
我有 3 个变量:
- wqReqIds:Id 列表
- 别名:在 table 中多次出现的别名列表(其中记录 ID 包含在 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();
下面的 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}";
}
}