有更好的方法来做这件事:
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);
答案 0 :(得分:2)
好吧,Select(el => el)
对你开始没有任何帮助。
我建议您使用SingleOrDefault
:
var productId = element.Elements("ProductId").SingleOrDefault();
if (productId != null)
filter.ProductId = Convert.ToInt32(productId.Value);
请注意,这会处理 no 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
如果没有指定ID就设置为0,那么你可以使用:
filter.ProductId = Convert.ToInt32(element.Elements("ProductId")
.Select(elt => elt.Value)
.SingleOrDefault());
(由于传递空参数时Convert.ToInt32
返回0的方式。)
答案 1 :(得分:1)
你真的需要在Linq到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);