是否可以在考虑区域设置的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将它加载到可以处理这种形式的回退的数据结构中。
与林克可能需要的任何弗兰肯斯坦方法相比,都不会或几乎没有成本。
根据我的经验,我还没有见过任何能做到这一点的东西。其他人可能已经。。