2016-08-27 3 views
0

私は実際にこれを試しましたが、それを正常に動作させることはできません。 私は、Linqを使って解析するファイルをたくさん持っていますが、その中には他のものにはないフィールドがあります。ファイル名で知る方法はありません。ここでスコープはtry catchとlinqを使用しています

はファイルに対して実行されるコードです:

var update = from d in document.Descendants("Update") 
         select new 
         { 
          OrderNumber = d.Element("OrderNumber").Value, 
          StopID = d.Element("StopID").Value, 
          TransmissionTime = d.Element("TransmissionTime").Value, 
          EventTime = d.Element("PODTime").Value, 
          recordCreated = d.Element("EventTime").Value, 
          EventType = d.Element("EventType").Value, 
          EventCode = d.Element("EventCode").Value, 
          POD = d.Element("POD").Value, 
          Note = d.Element("Note").Value, 
          CustomerID = d.Element("CustomerID").Value, 
          OrderID = d.Element("OrderID").Value, 
          StopRef = d.Element("StopRef").Value, 
          PieceCount = d.Element("PieceCount").Value, 
          TotalWeight = d.Element("TotalWeight").Value, 
          DriverID = d.Element("DriverID").Value 
         }; 

さて問題は、それらのいくつかは、要素(「PODTime」)を持っていないということですので、私はdiffernetのLINQクエリを必要としています。私はちょうどtry/catchを実行するつもりだったし、他のものを実行しなければ(私が知っているクールジー)。 しかし、明らかに私がtry/catchで更新を入れるとすぐ、私はもはやそれを外部にアクセスすることはできません。

通常はtry/catchの前に定義しますが、ここでは動作しません。

私が試してみました:

System.Linq.Enumerable update = new System.Linq.Enumerable(); 
をしかし、それは権利ではありません。誰かが私に正しい方向を指すことができたら、私はそれを感謝します。

ソリューション: 大ハンマーを使用してはレッツと組み合わせるナッジ:

var update = from d in document.Descendants("Update") 
          let elName = d.Element("PODTime") 
          select new 
          { 
           OrderNumber = d.Element("OrderNumber").Value, 
           StopID = d.Element("StopID").Value, 
           TransmissionTime = d.Element("TransmissionTime").Value, 
           EventTime = (elName != null) ? elName.Value : string.Empty, 
+0

をフィールドが存在しない場合に2つの異なる照会がある場合は、2つの別々の匿名オブジェクトを作成してください。フィールドが存在しない場合はnullまたは空の文字列を選択してください。 –

+0

これにはLinqを使用する必要がありますか?静的型を使用するとデシリアライゼーションがはるかに簡単になります – rlee

+0

Collin - 要素が存在しない場合、どうすればよいかわかりませんか?それはおそらく私の問題を解決するだろう。私は前にこの必要性に遭遇していません。 –

答えて

2

あなたは新しいを使用することができますか?。このためオペレータ:

d.Element("CustomerID")?.Value 

それとも、最新のC#を使用できない場合、あなたはすべてのあなたの呼び出しをラップする「安全な」方法で書くことができます:さてあなたは、本質的に行っている

string SafeGetValue(XElement elem) 
{ 
    if (elem == null) 
    return null; 

    return elem.Value; 
} 
+0

私は何の情報を見つけることができません?オペレーターがそれを使用する方法や使用方法について説明します。何と呼ばれている、Googleは私に失敗している! –

+0

@MostlyLucid空の条件演算子を検索します。私はそれを使用する方法を示した。どこでもヌルをチェックせずにコールを連鎖させることができます。 – SledgeHammer

+0

ヌル条件演算子? Visual Studioの新機能です。2015 –

関連する問題