Я создаю сайт на C # .NET 3.5. На этом сайте некоторый контент читается из файла XML. Этот XML-файл сохраняется из файла Excel, поэтому в основном Excel является своего рода системой управления контентом (в этой ситуации я не могу использовать базу данных). Я использую LINQ to XML для получения коллекций объектов контента, чтобы я мог работать с ними на веб-формах. Я только начинаю с 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-файл.
Я хотел бы создать ситуацию, когда строки с одинаковым идентификатором разделяют содержимое, поэтому мне не нужно добавлять избыточные значения. Возможно ли иметь «запасной вариант» для пустых значений?
Пример: создание файла xml (excel)
Если я хочу прочитать информацию на швейцарском немецком языке, запрос будет искать значения, для которых локаль - «de-ch». Если все еще есть пустые значения, запрос будет искать «более высокий» языковой стандарт, в данном случае «de», и последний, если еще есть пустые значения, он возьмет их из стандартного языкового стандарта, то есть «en».
Допустим, у меня есть объект Product.
У него есть название, описание и цена.
Начните с английского (en)
Я начну с культуры "en", потому что это моя стандартная культура.
В Excel я бы создал строку:
- Locale = en
- Имя = Товар 1
- Описание = английское описание
- Цена = 100
Тогда немецкий (де)
Затем я хочу перевод на немецкий язык, поэтому я добавляю еще одну строку, но я оставляю Имя и цену пустыми, потому что они одинаковые.
- Locale = de
- Имя =
- Описание = немецкое описание
- Цена =
Тогда швейцарский немецкий (де-ч)
Здесь я только хочу добавить цену, потому что у нее другая валюта.
- Locale = de-ch
- Имя =
- Описание =
- Цена = 222
Результат, к которому я стремлюсь в LINQ
Когда культура будет de-ch, возвращаемый объект в LINQ будет иметь следующие значения:
- Locale = de-ch
- Имя = Товар 1 (из en)
- Описание = немецкое описание (от де)
- Цена = 222 (от де-ч)
Я думаю, что смогу сделать это в обычном C # с некоторыми циклами, но как бы вы сделали это в Linq? Может, кто-нибудь подскажет, как мне этого добиться в LINQ.