使用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,
您可以使用新的?操作符:
d.Element("CustomerID")?.Value
或者如果你不能使用最新的c#,你可以写一个"安全"的方法来包装你所有的调用:
string SafeGetValue(XElement elem)
{
if (elem == null)
return null;
return elem.Value;
}