我怎么把它写成非LINQ代码?

我发现了一些如何从Excel电子表格>> HERE <<中读取XML的例子,我正试图让代码为我工作。 我必须编写一个例程,从工作簿中的15个工作表中的4个工作表中获取数据,并使用该数据填充我们的数据库。 无论如何….

每次尝试查询我的Excel电子表格时,此代码都会抛出InvalidOperationExceptionexception:

 static XElement GetWorksheet(string sheetName, PackagePartCollection allParts) { XElement element = null; try { PackagePart worksheetPart = (from part in allParts where part.Uri.OriginalString.Equals(String.Format("/xl/worksheets/{0}.xml", sheetName)) select part).Single(); element = XElement.Load(XmlReader.Create(worksheetPart.GetStream())); } catch (Exception err) { // catches InvalidOperationException Console.WriteLine(err.Message); } return element; } 

具体错误是“序列不包含任何元素”

我真的不知道如何去debugging它,因为我不确定代码正在做什么。

有人可以帮我把它写在标准的“C#之前,我尝试实现奇特的LINQexpression?(这 LINQ,对不对?)

[解决了]

使用JeffN825提供的片段,我能够创build这个:

 static XElement GetWorksheet(string sheetName, PackagePartCollection allParts) { string xmlCompare = string.Format("/xl/worksheets/{0}.xml", sheetName); foreach (PackagePart part in allParts) { string original = part.Uri.OriginalString; if (original == xmlCompare) { XElement element = XElement.Load(XmlReader.Create(part.GetStream())); return element; } } return null; } 

事实certificate,即使Excel中的表格名称是“HV”,“M2”,“CB”和“CC”,我仍然必须将它们指定为“sheet2”,“sheet3”,“sheet4”和“sheet5” 。

我不得不通过161 PackagePart对象来看看这个。

LINQ是如此的高效,以至于在出现问题的时候很难debugging。

.Single()是抛出exception的东西。 要么你的查询没有返回任何项目或返回> 1项目。 如果您不确定预期的项目数量,则应该使用FirstOrDefault() ,它将返回第一个匹配项,如果找不到匹配项,则返回null。

非LINQ的等价物是这样的

 PackagePart worksheetPart = null foreach(var part in allParts) { if (part.Uri.OriginalString.Equals(String.Format("/xl/worksheets/{0}.xml", sheetName)))) { if (part != null) throw new InvalidOperationException(); // > 1 match worksheetPart = part; } } if (part == null) throw new InvalidOperationException(); // no match 

这基本上是这样做的。

 PackagePart worksheetPart; foreach(PackagePart part in allParts) { if(part.Uri.OriginalString.Equals(String.Format("/xl/worksheets/{0}.xml", sheetName))) { worksheetPart = part; break; } } 

在你的版本中,用.FirstOrDefault()replace.Single()。

由于没有匹配而失败

 (from part in allParts where part.Uri.OriginalString.Equals(String.Format("/xl/worksheets/{0}.xml", sheetName)) select part).Single(); 

你的错误是Single() 。 如果你的查询没有任何值,Single()会抛出exception。 你应该使用SingleOrDefault() ,如果查询中没有值,它将返回null