获取包含两条记录的元素列表
本文关键字:元素 列表 记录 包含两 获取 | 更新日期: 2023-09-27 18:09:38
我有一个表,看起来有点像这样;
id - int
tpc - string
dcid - int
other fields
这个唯一的对实际上是tpc
和dcid
。tpc
可以是LQ,也可以是GR。以后可能会有更多,但现在只有两个。
所以我正在寻找通过LINQ获得记录列表,其中有两个具有相同cid的记录,一个用于LQ,一个用于GR。
所以如果我有以下数据;
1, GR, 1, ...
2, LQ, 1, ...
3, GR, 2, ...
4, GR, 3, ...
5, LQ, 3, ...
我希望返回的列表是1,2,4,5。
3不会出现在列表中,因为它缺少dcid 2的LQ条目。
我已经尝试了各种查询,但我正在努力检查两个dcid与tpc的逻辑。
var required = new List<string> { "LQ", "GR" };
var query = data
.GroupBy(x => x.dcid)
.Where(g => g
.Select(x => x.tpc)
.Intersect(required)
.Count() == required.Count)
.Select(g => g.Key);
所以,如果我理解正确的话,您希望返回每个可用TPC类型存在记录的ID。在您的示例中,有2种TPC类型,但可能有更多。
像这样工作:
var tpcs = new List<string>();
var filtered = records.GroupBy(record =>
{
//Keep a track of the available TPC types
if (!tpcs.Contains(record.TPC))
{
tpcs.Add(record.TPC);
}
return record.DCID;
})
.Where(group =>
{
//Get the TPCs for the group
var groupTpcs = group.Select(record => record.TPC);
//Only return groups that have records for all the TPC types
return groupTpcs.Intersect(tpcs).Count() == tpcs.Count;
});
//Print groups
foreach (var group in filtered)
{
Console.WriteLine(group.Key);
foreach (var record in group)
{
Console.WriteLine("'tID = {0}, TPC = {1}, DCID = {2}", record.ID, record.TPC, record.DCID);
}
}
结果:
1
ID = 1, TPC = GR, DCID = 1
ID = 2, TPC = LQ, DCID = 1
3
ID = 4, TPC = GR, DCID = 3
ID = 5, TPC = LQ, DCID = 3
如果你只想要id,在LINQ语句后面加一个SelectMany
.SelectMany(group =>
{
//Return a list of IDs for each record in the group
return group.Select(record => record.ID);
});
我不确定我是否会推荐这种方法