2012-01-18 21 views
0

私はLinq To Xmlを使用してDataSetからXmlファイルを作成しています。このデータセットでは、1:M関係の顧客、受注テーブルがあります。Linq to Xml - 条件付きでXAttributeを作成する

私のコードスニペット -
現在の顧客注文のタイプが「オンライン」の場合、XElement 'OnlineOrder'にいくつかの属性を追加しようとしています。そうでなければ、 'Online'タイプの注文がなければ、<OnlineOrder/>のような空のXElementを作成したいと思います。

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

上記のコードは正常です。

しかし、私は、私はいくつかの余分な属性を追加しています2行のコメントを外した場合、私はそれらのいずれかがあることで、いくつかのコンパイルエラーを取得する - これが起こっている理由を案内してください

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

ありがとうございました!それが私の頭の中に来ていないのが分かりません:-(とにかく、「メソッドに分解してください」--expressionのメソッドを作成してXAttributeコレクションを返すべきでしょうか?これはLinq2Xmlの私の最初の実験です。私のコードの中で最も目を引く高密度な領域が分裂する可能性があります。それも参考にしてください。 – iniki

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