LINQ to XML Вопрос новичка - PullRequest
0 голосов
/ 16 апреля 2009

есть ли лучший способ сделать такую ​​вещь:

var filter = new CashFilters();
var element = XElement.Parse(request.OuterXml);

var productId = element.Elements("ProductId").Select(el => el);

if (productId.Count() == 1)
    filter.ProductId = Convert.ToInt32(productId.Single().Value);

Ответы [ 2 ]

2 голосов
/ 16 апреля 2009

Ну, Select(el => el) не годится для вас.

Я предлагаю вам использовать SingleOrDefault:

var productId = element.Elements("ProductId").SingleOrDefault();
if (productId != null)
    filter.ProductId = Convert.ToInt32(productId.Value);

Обратите внимание, что это обрабатывает случай, когда нет элементов ProductId, но выдает исключение, если больше, чем один . Если это действительно правильный случай, то ваш текущий код (без избыточного вызова Select) является разумным.

РЕДАКТИРОВАТЬ: Вы могли бы уйти от этого с:

var productId = element.Elements("ProductId")
                       .Select(elt => elt.Value)
                       .SingleOrDefault();
filter.ProductId = Convert.ToInt32(productId ?? filter.ProductId.ToString());

Но это ужасно;)

По существу, у вас есть условие - вы можете установить ProductId, только если оно указано. Оператор if - это общепринятый способ условного выполнения кода:)

Есть альтернативы:

filter.ProductId = productId == null 
                   ? filter.ProductId 
                   : int.Parse(productId);

Если вы не возражаете против установки filter.ProductId в 0, если идентификатор не указан, то вы можете просто использовать:

filter.ProductId = Convert.ToInt32(element.Elements("ProductId")
                                          .Select(elt => elt.Value)
                                          .SingleOrDefault());

(из-за способа, которым Convert.ToInt32 возвращает 0 при передаче нулевого аргумента.)

1 голос
/ 16 апреля 2009

Вам действительно нужно сделать это в Linq to Xml? Подход Xml DOM кажется мне более разумным.

Рассматривали ли вы чисто XML-подход?

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(request.OuterXml);

    var node = doc.SelectSingleNode("//ProductId[1]");
    if (node != null)
        filter.ProductId = Convert.ToInt32(node.InnerText);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...