C# 在匿名对象中将属性值用作属性名

C# 在匿名对象中将属性值用作属性名,c#,linq,C#,Linq,是否可以在.Select中使用属性值作为匿名对象的值。。。声明 我从服务器返回一个简单的项目列表,并根据属性对其进行分组。 从数据库返回的get对象如下所示: public class Locale { public int LanguageId { get; set; } public string Key { get; set; } public string Value { get; set; } public string ParentKey { get;

是否可以在.Select中使用属性值作为匿名对象的值。。。声明

我从服务器返回一个简单的项目列表,并根据属性对其进行分组。 从数据库返回的get对象如下所示:

public class Locale
{
    public int LanguageId { get; set; }
    public string Key { get; set; }
    public string Value { get; set; }
    public string ParentKey { get; set; }
}
一个简单的EF查询将从数据库返回所有项目:

var locales = await _context.Locales.ToListAsync();
然后我将其分组:

var result = locales.GroupBy(x => x.ParentKey).Where(x => null != x.Key);
然后我想使用键,例如_title,作为匿名对象中的属性名。原因是,我需要将数据传递给第三方角度组件,他们希望返回属性是键的值,属性的值是

我的尝试到此为止,但这不起作用:

var output = result.SelectMany(x => new {
    lang = x.Key,
    data = x.SelectMany(p => new {
        p.Key = p.Value
    })
});
原因是匿名方法需要定义的属性名。
我本来希望不用复杂的反射/作业对象路线,但这似乎是唯一的办法。

您可以将每个分组投影到字典中。然后将其序列化并获得所需的输出:

var output = locales.Where(x => x.ParentKey != null)
                    .GroupBy(x => x.ParentKey)                                
                    .Select(x => new {
                        lang = x.Key,
                        data = x.ToDictionary(k => k.Key, v => v.Value)
                    });

var json = Newtonsoft.Json.JsonConvert.SerializeObject(output);
例如,数据:

var locales = new List<Locale> {
    new Locale { LanguageId = 1, Key = "a", Value = "1", ParentKey = "1" },
    new Locale { LanguageId = 2, Key = "b", Value = "2", ParentKey = "2" },
    new Locale { LanguageId = 3, Key = "c", Value = "3", ParentKey = "2" },
};

将其投影为词典是一个好的选择吗?所有具有相同ParentKey的键属性都相同吗?不幸的是,它们在{lang:en,data:{{u title:my awesome title}}中需要它,其中{u title实际上可以是用户定义的任何键。只要是这种格式。是的,所有parentkey都是相同的。分组工作得很好,因此我可以检索需求find[{lang:en},{lang:fr}]的第一部分,我正在处理的是动态数据:{}。我从来没有尝试过在没有反射的情况下从C中这样做:$输出格式应该是json格式吗?不管怎样,我很愚蠢。我们应该放弃发展。由于JSON序列化使用字典的键/值部分来构建JSON字符串,所以向字典的投影肯定会起作用。谢谢你,吉拉德格林。我将从dev退休:DHaha:很高兴这是一个好的解决方案:这就是我验证JSON的原因
[{"lang":"1","data":{"a":"1"}},
 {"lang":"2","data":{"b":"2","c":"3"}}]