我的資料庫中有一個存盤翻譯的表
| 資源密鑰 | 資源文本 | 語言標識 |
|---|---|---|
| 家 | 家 | 1 |
| 家 | 下擺 | 2 |
| 搜索 | 搜索 | 1 |
| 搜索 | 索克 | 2 |
和語言表
| ID | 語言 |
|---|---|
| 1 | 英語 |
| 2 | 瑞典 |
我正在嘗試回傳一個看起來像這樣的物件
{
"Home":{
"Swedish":"Hem",
"English":"Home"
},
"Search":{
"Swedish":"S?k",
"English":"Search"
}
}
我開始做
var data = await _context.Translations
.Include(x => x.Language)
.ToListAsync();
return data.ToLookup(p => p.ResourseKey , p => p).ToDictionary(x => x.Key, x => x.ToArray());
但我不能再進一步了
我想格式化查找短語以回傳所需的結構,而不是只回傳p
我當然可以在客戶端通過 js 修復它,但我想在服務器上完成所有繁重的作業
如果我的問題是非結構化的,我真的很抱歉這是第一次在 SOF 上發布問題
uj5u.com熱心網友回復:
要格式化 json,您可以使用 JsonConverter 類,write 方法是生成輸出的方法。引數撰寫器有許多方法可以幫助您根據需要生成輸出。
public class ResourceByLanguage
{
public string Language { get; set; }
public string Value { get; set; }
public ResourceByLanguage(Resource resource)
{
Language = resource.Language.Title;
Value = resource.Text;
}
}
和:
public class ResourceByLanguageConverter : JsonConverter<ResourceByLanguage[]>
{
public override ResourceByLanguage[]? Read(ref Utf8JsonReader reader, Type typeToConvert,
JsonSerializerOptions options)
{
throw new NotImplementedException();
}
public override void Write(Utf8JsonWriter writer, ResourceByLanguage[] values, JsonSerializerOptions options)
{
writer.WriteStartObject();
foreach (var value in values)
{
writer.WritePropertyName(value.Language);
writer.WriteStringValue(value.Value);
}
writer.WriteEndObject();
}
}
和(在控制臺應用程式上):
var result = resources
.GroupBy(p => p.ResourceKey)
.ToDictionary(p => p.Key,
p => p.Select(resource => new ResourceByLanguage(resource)).ToArray());
var jsonConverter = new JsonSerializerOptions()
{
Converters = {new ResourceByLanguageConverter()}
};
var json = JsonSerializer.Serialize(result, jsonConverter);
Console.WriteLine(json);
將生成此輸出:
{"home":{"English":"Home","Swedish":"Hem"},"search":{"English":"Search"}}
如果您使用的是 aspnet,則通過在您的 services.AddController 行(可以在 Program.cs 或 Startup.cs)上添加此代碼來注冊轉換器:
services.AddControllers().AddJsonOptions(j =>
{
j.JsonSerializerOptions.Converters.Add(new ResourceByLanguageConverter());
});
然后使用:
return resources
// here you have to add the include that you used on question
.GroupBy(p => p.ResourceKey)
.ToDictionary(p => p.Key,
p => p.Select(resource => new ResourceByLanguage(resource)).ToArray());
和 aspnet 你做的作業。
uj5u.com熱心網友回復:
我認為 Inner Join 可以在這種情況下為您提供幫助。
考慮有兩個物體,如下所示:
public class Word
{
public int Id { get; set; }
public string ResourseKey { get; set; }
public string ResourseText { get; set; }
public string Language { get; set; }
}
和另一個:
public class Language
{
public int Id { get; set; }
public string Lang { get; set; }
}
現在我們為內部連接初始化一些資料并選擇我們需要的資料:
internal class Program
{
static void Main(string[] args)
{
List<Language> languages = new List<Language>()
{
new Language{Id = 1, Lang="English"},
new Language{Id = 2, Lang="Swedish"}
};
List<Word> words = new List<Word>()
{
new Word{Id = 1, ResourseKey = "Home", ResourseText = "Home", Language = "English"},
new Word{Id = 1, ResourseKey = "Home", ResourseText = "Hem", Language = "Swedish"},
new Word{Id = 1, ResourseKey = "Search", ResourseText = "Search", Language = "English"},
new Word{Id = 1, ResourseKey = "Search", ResourseText = "S?k", Language = "Swedish"},
};
var innerGroupJoinQuery =
from lang in languages
join word in words on lang.Lang equals word.Language into prodGroup
select new { LangName = lang.Lang, Words = prodGroup };
foreach (var item in innerGroupJoinQuery)
{
Console.WriteLine($"Name: {item.LangName}");
foreach (var w in item.Words)
{
Console.WriteLine($"---Word: {w.ResourseText}");
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/454773.html
