C# 联接表并选择作为KeyValuePairs列表

C# 联接表并选择作为KeyValuePairs列表,c#,linq,C#,Linq,在一对多的关系中,一方引用另一方 这是两个表的简化版本(不知道如何设置表的格式以使其看起来非常抱歉…): 表A: 身份证 表B:TableAId(FK)、键、值 当我使用LINQ连接检索值时,我需要将引用表中的值转换为keyvaluepairs列表。 因此,我要寻找的示例答案是: { Id : 1, Data: [ { key : key1, value : valu1 }, { k

在一对多的关系中,一方引用另一方

这是两个表的简化版本(不知道如何设置表的格式以使其看起来非常抱歉…):

表A: 身份证

表B:TableAId(FK)、键、值

当我使用LINQ连接检索值时,我需要将引用表中的值转换为keyvaluepairs列表。 因此,我要寻找的示例答案是:

{
   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()
});

您需要删除
新列表您需要删除
新列表