[英]Good way to connect parent table/entity with child table/entities?
當前,我正在使用Entity Framework,並且有兩個數據庫表,一個“父”表和一個“子”表用於存儲與語言相關的字符串:
我想“智能”獲取遵循此“算法”的所有元素及其子元素的列表:
- 獲取語言A的子元素。
- 如果不可用,請獲取語言B的子元素。
(備用語言B始終存在)。
結果看起來像這樣:
即,對於項目4,沒有使用語言“ DE”(德語)的條目,因此發生了對語言“ EN”(英語)的回退。
當僅依賴一種語言時,我可以使用以下代碼:
using (var ctx = new MyEntities())
{
var items =
ctx.Items.Select(
i =>
new ItemModel
{
Id = i.Id,
Name = i.ChildItems.FirstOrDefault(x => x.Language == "DE").Name
});
}
由於我也必須使用后備語言,因此我唯一想到的就是使用foreach
循環。
理想情況下,我想避免這種情況,並使用一個單獨的LINQ語句,類似於上面的語句。
所以我的問題是:
我可以在一個LINQ語句中表達我的“算法”嗎?
我認為您應該執行以下操作,假設您具有按優先級排序的語言列表:
var languages = new List<string> {"DE", "EN", "FR"};//Can add more
using (var ctx = new MyEntities())
{
var items =
ctx.Items.Select(
i => new ItemModel
{
Id = i.Id,
Name = languages.Select(lang=> i.ChildItems
.FirstOrDefault(x=>x.Language == lang))
.FirstOrDefault(x=>x!=null).Name;//Suppose the default value of ChildItem is null (a reference type).
});
}
或這個:
using (var ctx = new MyEntities())
{
var items =
ctx.Items.Select(
i => new ItemModel
{
Id = i.Id,
Name = i.ChildItems.FirstOrDefault(x=>languages.Any(k=>k == x.Language)).Name
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.