使用try catch和linq作用域

本文关键字:linq 作用域 catch try 使用 | 更新日期: 2023-09-27 18:04:14

我真的尝试过这个,但只是不能完全得到它的工作。我有一堆文件,我正在使用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"),所以我需要一个不同的linq查询。我只是想做一个try/catch,如果它失败了,运行另一个(我知道很模糊)。但是很明显,只要我在try/catch中放入update,我就不能再在它之外访问它了。

通常我只会在try/catch之前定义它-但是我不能让它在这里工作

I have try:

System.Linq.Enumerable update = new System.Linq.Enumerable();

但这是不对的。如果有人能给我指出正确的方向,我会很感激的。

解决方案:使用大锤助推和Let组合:

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,

使用try catch和linq作用域

您可以使用新的?操作符:

d.Element("CustomerID")?.Value

或者如果你不能使用最新的c#,你可以写一个"安全"的方法来包装你所有的调用:

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