将父表/实体与子表/实体连接的好方法?

时间:2013-08-12 10:11:28

标签: c# asp.net-mvc linq entity-framework linq-to-sql

目前,我正在使用Entity Framework并且有两个数据库表,一个“父”表和一个“子”表来存储与语言相关的字符串:

enter image description here

我希望“智能”获取所有元素及其子元素的列表遵循此“算法”:

  
      
  1. 获取语言A的子元素。
  2.   
  3. 如果不可用,请获取语言B的子元素。
  4.   

(后备语言B始终存在)。

结果看起来像这样:

enter image description here

即。对于第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语句中表达我的“算法”吗?

1 个答案:

答案 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                 
        });
}