Linq to Xml - 有条件地创建XAttribute

时间:2012-01-18 21:55:50

标签: c# linq-to-xml

我正在使用Linq To Xml从DataSet创建一个Xml文件。此数据集具有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 个答案:

答案 0 :(得分:3)

您需要提供属性列表......

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)),

顺便说一句,如果代码不那么密集,你的代码将更容易跟踪/调试。为什么不把它分解成方法,或者使用局部变量?

答案 1 :(得分:0)

请参阅此帖子中的我的设置功能: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);
}