Возможно ли иметь запасной вариант для пустых значений в запросе LINQ с учетом локали? - PullRequest
4 голосов
/ 10 января 2012

Я создаю сайт на 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.

1 Ответ

3 голосов
/ 10 января 2012

В интересах ясности, кому бы это ни понадобилось, я бы предложил загрузить его через linq, как у вас, в структуру данных , которая может справиться с этой формой возврата.

По сравнению с любым подходом Франкенштейна, который, вероятно, понадобится Линку, не будет никаких или небольших затрат.

И по своему опыту я не видел ничего, что могло бы сделать это.У кого-то еще может быть ..

...