C# 在匿名对象中将属性值用作属性名
是否可以在.Select中使用属性值作为匿名对象的值。。。声明 我从服务器返回一个简单的项目列表,并根据属性对其进行分组。 从数据库返回的get对象如下所示: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;
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"}}]