Linq to Xml - Создайте XAttribute условно - PullRequest
0 голосов
/ 19 января 2012

Я использую Linq To Xml для создания файла XML из DataSet. Этот набор данных имеет таблицу Customer, Orders с отношениями 1: M.

Вот мой фрагмент кода -
Если какой-либо текущий заказ клиента имеет тип «Онлайн», то я пытаюсь добавить несколько атрибутов в XElement «OnlineOrder». В противном случае, если нет заказа с типом «Онлайн», я хочу создать пустой XElement, такой как <OnlineOrder/>.

    new XElement("OnlineOrder", ((customerDT.FindByCustomerId(x.CustomerId).GetOrdersRows().Where(o=>o.Type=="Online").Any())
            ? customerDT.FindByCustomerId(x.CustomerId).GetOrdersRows().Where(p1 => p1.Type == "Online").Select(
                (o1 => new XAttribute("Amount", o1.Amount)//,
                        //new XAttribute("CardType", o1.CardType),
                        //new XAttribute("Quantity", o1.Quantity)
                ))
            : null)),

Над кодом работает нормально.

Но если я раскомментирую две строки, в которые добавляю какой-то дополнительный атрибут, я получаю несколько ошибок компиляции, одна из которых -

Invalid expression term ':'

Пожалуйста, объясните, почему это происходит.

Спасибо!

Ответы [ 2 ]

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

Вам необходимо предоставить список атрибутов ...

new XElement("OnlineOrder", ((customerDT.FindByCustomerId(x.CustomerId).GetOrdersRows().Where(o=>o.Type=="Online").Any())
        ? customerDT.FindByCustomerId(x.CustomerId).GetOrdersRows().Where(p1 => p1.Type == "Online").Select(
            (o1 => new List<XAttribute>() { new XAttribute("Amount", o1.Amount),
                    new XAttribute("CardType", o1.CardType),
                    new XAttribute("Quantity", o1.Quantity) }
            ))
        : null)),

Кстати, ваш код был бы намного легче отслеживать / отлаживать, если бы он не был настолько плотным.Почему бы не разбить его на методы или использовать локальные переменные?

0 голосов
/ 19 января 2012

См. Мою функцию Set в этом посте: https://stackoverflow.com/a/8899367/353147

Затем выполните:

XElement order = new XElement("OnlineOrder");
if( your condition )
{
    Set(order, "Amount", o1.Amount, true);
    Set(order, "CardType", o1.CardType, true);
    Set(order, "Quantity", o1.Quantity, true);
}

Установка обычно является методом расширения, поэтому, если вы знаете об этом и конвертируете его,станет.

XElement order = new XElement("OnlineOrder");
if( your condition )
{
    order.Set("Amount", o1.Amount, true)
         .Set("CardType", o1.CardType, true)
         .Set("Quantity", o1.Quantity, true);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...