2012-01-18 50 views
0

我正在使用Linq To Xml从DataSet创建一个Xml文件。此数据集具有1:M关系的Customer,Orders表。Linq to Xml - 有条件地创建XAttribute

这里是我的代码片段 -
如果任何当前客户订单的类型,然后我试图几个属性添加到的XElement“网上订单”的“在线”。否则,如果没有“在线”类型的订单,那么我想创建一个空的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 ':' 

请指导为什么发生这种情况。

谢谢!

回答

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

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

+0

非常感谢!不知道为什么它没有进入我的脑海:-(无论如何,将它分解成方法 - 应该为exp创建方法 - 返回XAttribute集合对不起,这是我对Linq2Xml的第一个实验,所以如果你可以指定我的代码中最引人注目的密集区域可以分解 - 请为此指导。干杯! – iniki 2012-01-18 22:09:29

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); 
}