考虑到语言环境,是否可以在LINQ查询中为空值进行回退?

时间:2012-01-10 13:37:17

标签: c# asp.net linq excel locale

我正在创建一个C#.NET 3.5网站。在本网站中,从XML文件中读取一些内容。这个XML文件是从Excel文件中保存的,所以基本上Excel是一种内容管理系统(在这种情况下我不能使用数据库)。我正在使用LINQ to XML来获取内容对象的集合,以便我可以在webforms上使用它们。我只是从LINQ开始,但我知道分组和订购等基础知识。

我使用以下代码将内容读入集合(在本例中为视频列表):

string path = String.Format(server.MapPath("~/App_Data/Content.{0}.xml"), culture);
XDocument source = cache.Get(path);

bool boolValue = false;

var query =
    from video in source.Descendants("Video")
    where video.Attribute("Id").Value != null

    /* Temporary values */
    let featured = video.Attribute("IsFeatured").Value

    select new Video
    {
        Culture = culture, 
        Id = video.Attribute("Id").Value, 
        Name = video.Element("Name").Value,
        Description = video.Element("Description").Value,
        Category = video.Element("Category").Value,
        Url = video.Element("Url").Value,
        IsFeatured = Boolean.TryParse(featured, out boolValue) ? boolValue : false, 
        Tags = video.Element("Tags").Value.Split(',').Select(t => t.Trim()).ToArray()
    };

return query.ToList();

在目前的情况下,每种文化都有一个xml文件。市长的缺点是它会导致很多冗余值。为了使其更易于管理,我将只有一个xml文件。

我想创建一种情况,其中具有相同id的行共享内容,因此我不必添加冗余值。是否可以对空值进行“后退”?

示例:创建xml(excel)文件

如果我想阅读瑞士德语内容,查询将查找语言环境为“de-ch”的值。如果仍有空值,则查询将查找“更高”的区域设置,在本例中为“de”,如果仍有空值,则将从默认区域设置(即“en”)中获取它们。

假设我有一个Product对象。 它有名称,描述和价格。

以英语(en)开头

我将从文化'en'开始,因为这是我的标准文化。 在excel中我会创建一行:

  • Locale = en
  • 姓名=产品1
  • 描述=英文说明
  • 价格= 100

然后是德语(de) 然后我想要一个德语翻译,所以我添加了另一行,但我将名称和价格留空,因为有相同的。

  • Locale = de
  • 姓名=
  • 描述=德语描述
  • 价格=

然后瑞士德语(de-ch) 在这里我只想加价,因为它有不同的货币。

  • Locale = de-ch
  • 姓名=
  • Description =
  • 价格= 222

我在LINQ中的目标

当文化被删除时,LINQ中的返回对象将具有以下值:

  • Locale = de-ch
  • 名称=产品1(来自en)
  • 描述=德语描述(来自de)
  • 价格= 222(来自de-ch)

我想我可以在正常的C#中使用一些循环来完成它,但是你会如何在Linq中执行此操作?也许有人可以指出如何在LINQ中实现这一目标。

1 个答案:

答案 0 :(得分:3)

为了清楚明白任何人要接受这个,我建议你通过linq将它加载到一个数据结构中来处理这种形式的后备。

与Linq可能需要的任何frankenstein方法相比,没有成本或成本很低。

根据我的经验,我没有看到任何可以做到这一点的事情。别人可能有......