0

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

在此处输入图像描述

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

  1. 获取语​​言 A 的子元素。
  2. 如果不可用,则获取语言 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 语句中表达我的“算法”吗?

4

1 回答 1

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                 
        });
}
于 2013-08-12T11:39:18.907 回答