是否可以在考虑区域设置的LINQ查询中对空值进行回退

本文关键字:查询 空值 回退 LINQ 设置 区域 是否 | 更新日期: 2023-09-27 18:20:05

我正在创建一个C#.NET 3.5网站。在这个网站中,一些内容是从XML文件中读取的。这个XML文件是从Excel文件中保存的,所以Excel基本上是一种内容管理系统(在这种情况下我不能使用数据库)。我正在使用LINQ to XML来获取内容对象的集合,这样我就可以在Web表单上使用它们了。我刚开始学习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中,我会创建一行:

  • 区域设置=en
  • 名称=产品1
  • 描述=英文描述
  • 价格=100

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

  • 区域设置=de
  • 名称=
  • 描述=德语描述
  • 价格=

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

  • 区域设置=de ch
  • 名称=
  • 说明=
  • 价格=222

我在LINQ中的目标结果

当区域性是de-ch时,LINQ中返回的对象将具有以下值:

  • 区域设置=de ch
  • 名称=产品1(来自en)
  • Description=德语描述(来自de)
  • 价格=222(从价格开始)

我想我可以在普通的C#中用一些循环来完成,但在Linq中你会怎么做呢?也许有人可以指导我如何在LINQ中实现这一点。

是否可以在考虑区域设置的LINQ查询中对空值进行回退

为了清楚谁将接管它,我建议通过linq将它加载到可以处理这种形式的回退的数据结构中。

与林克可能需要的任何弗兰肯斯坦方法相比,都不会或几乎没有成本。

根据我的经验,我还没有见过任何能做到这一点的东西。其他人可能已经。。