目前,我正在使用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语句中表达我的“算法”吗?
答案 0 :(得分:1)
我认为你应该做这样的事情,假设你有一个按优先级排序的语言列表:
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
});
}