C# 联接表并选择作为KeyValuePairs列表
在一对多的关系中,一方引用另一方 这是两个表的简化版本(不知道如何设置表的格式以使其看起来非常抱歉…): 表A: 身份证 表B:TableAId(FK)、键、值 当我使用LINQ连接检索值时,我需要将引用表中的值转换为keyvaluepairs列表。 因此,我要寻找的示例答案是:C# 联接表并选择作为KeyValuePairs列表,c#,linq,C#,Linq,在一对多的关系中,一方引用另一方 这是两个表的简化版本(不知道如何设置表的格式以使其看起来非常抱歉…): 表A: 身份证 表B:TableAId(FK)、键、值 当我使用LINQ连接检索值时,我需要将引用表中的值转换为keyvaluepairs列表。 因此,我要寻找的示例答案是: { Id : 1, Data: [ { key : key1, value : valu1 }, { k
{
Id : 1,
Data:
[
{
key : key1,
value : valu1
},
{
key : key2,
value : value2
}
]
}
这是我现在的LINQ的样子
from a in _context.A
join b in _context.B
on a.Id equals b.AId
select new {
Id = a.Id,
Data = new List<KeyValuePair<string, string>()
.Select(b => new KeyValuePair<string, string>(b.Key, b.Value))
.ToList()
}
来自一个上下文。a
在上下文中加入b
a.Id等于b.AId
选择新的{
Id=a.Id,
数据=新列表新键值对(b.Key,b.Value))
托利斯先生()
}
希望我的问题/示例有意义,但如果需要澄清,请告诉我
更新:根据评论,我尝试将LINQ更改为:
from a in _context.A
select new {
Id = a.Id,
Data = (from b in _context.B
where b.AId = a.Id
select new{
b.Key,
b.Value
}).AsEnumerable()
.Select(b => new KeyValuePair<string, string>(b.Key, b.Value))
.ToList()
}
来自一个上下文。a
选择新的{
Id=a.Id,
数据=(来自_context.b中的b
其中b.AId=a.Id
选择新的{
b、 钥匙,
b、 价值观
}).可计算的()
.选择(b=>newkeyvaluepair(b.Key,b.Value))
托利斯先生()
}
但是它弹出了一个异常您在加入两个表后缺少分组数据
from grp in (from a in listA
join b in listB
on a.Id equals b.TableAId
select new { a.Id, b.Key, b.Value })
group grp by grp.Id into i
select new
{
Id = i,
Data = (from x in i select new KeyValuePair<string, string>(x.Key, x.Value)).ToList()
};
来自grp in(来自列表a中的a
在列表b中加入b
关于a.Id等于b.TableAId
选择新的{a.Id,b.Key,b.Value})
按grp.Id将grp分组到i中
选择新的
{
Id=i,
数据=(从i中的x选择新的KeyValuePair(x.Key,x.Value)).ToList()
};
Linq Lambda版本
listA.Join(listB,
a => a.Id,
b => b.TableAId,
(objectA, objectB) => new { objectA.Id, objectB.Key, objectB.Value })
.GroupBy(x => x.Id)
.Select(group => new {
Id = group.Key, //it's group by key (your Id, not your Key)
Data = group.Select(x => new KeyValuePair<string, string>(x.Key, x.Value)).ToList()
});
listA.Join(listB,
a=>a.Id,
b=>b.TableAId,
(objectA,objectB)=>new{objectA.Id,objectB.Key,objectB.Value})
.GroupBy(x=>x.Id)
.选择(组=>新建{
Id=group.Key,//它是按键分组的(您的Id,不是您的键)
Data=group.Select(x=>newkeyvaluepair(x.Key,x.Value)).ToList()
});
加入两个表后,您的分组数据不足
from grp in (from a in listA
join b in listB
on a.Id equals b.TableAId
select new { a.Id, b.Key, b.Value })
group grp by grp.Id into i
select new
{
Id = i,
Data = (from x in i select new KeyValuePair<string, string>(x.Key, x.Value)).ToList()
};
来自grp in(来自列表a中的a
在列表b中加入b
关于a.Id等于b.TableAId
选择新的{a.Id,b.Key,b.Value})
按grp.Id将grp分组到i中
选择新的
{
Id=i,
数据=(从i中的x选择新的KeyValuePair(x.Key,x.Value)).ToList()
};
Linq Lambda版本
listA.Join(listB,
a => a.Id,
b => b.TableAId,
(objectA, objectB) => new { objectA.Id, objectB.Key, objectB.Value })
.GroupBy(x => x.Id)
.Select(group => new {
Id = group.Key, //it's group by key (your Id, not your Key)
Data = group.Select(x => new KeyValuePair<string, string>(x.Key, x.Value)).ToList()
});
listA.Join(listB,
a=>a.Id,
b=>b.TableAId,
(objectA,objectB)=>new{objectA.Id,objectB.Key,objectB.Value})
.GroupBy(x=>x.Id)
.选择(组=>新建{
Id=group.Key,//它是按键分组的(您的Id,不是您的键)
Data=group.Select(x=>newkeyvaluepair(x.Key,x.Value)).ToList()
});
您需要删除新列表您需要删除新列表