2009-03-19 2 views
1

는 다음 XML 조각을 감안할 때 :Linq to XML 질의 다시 속성을 최적화하는 방법은 무엇입니까?

<root> 
    <sheetData> 
    <row r="1" /> 
    <row r="2" /> 
    <row r="3" /> 
    <row r="4" /> 
    <row r="5" /> 
    <row r="6" /> 
    <row r="7" /> 
    </sheetData> 
</root> 
다음 코드를 생성 할 수 있습니다

:

XElement testElement = new XElement("root", 
    new XElement("sheetData", 
     new XElement("row", 
      new XAttribute("r", 1)), 
     new XElement("row", 
      new XAttribute("r", 2)), 
     new XElement("row", 
      new XAttribute("r", 3)), 
     new XElement("row", 
      new XAttribute("r", 4)), 
     new XElement("row", 
      new XAttribute("r", 5)), 
     new XElement("row", 
      new XAttribute("r", 6)), 
     new XElement("row", 
      new XAttribute("r", 7)))); 

이의 R 속성이 2 행을 찾을 수있는 가장 좋은 방법이 있나요? 이 작동하지만 더 나은 방법과 더 효율적인 방법이 있는지 경우 선택 문에서 Where 절을 반복 오전 및 궁금합니다.

int rowNumber = 2; 

XElement rowElement = testElement 
    .Descendants("sheetData") 
    .Where<XElement>(item => item.Descendants("row") 
            .Where<XElement>(i => i.Attribute("r").Value == rowNumber.ToString()) 
            .FirstOrDefault<XElement>() != null) 
    .Select<XElement, XElement>(item => item.Descendants("row") 
            .Where<XElement>(i => i.Attribute("r").Value == rowNumber.ToString()) 
            .FirstOrDefault<XElement>()) 
    .FirstOrDefault<XElement>(); 

일반적으로 Linq 대 XML 쿼리가 최적화되었는지 확인하는 가장 좋은 방법은 무엇입니까?

답변

3

가장 좋은 방법은 다음과 같습니다

var row = testElement 
    .XPathSelectElements("sheetData/row[@r='2']") 
    .FirstOrDefault(); 

Where 호출을 반복하지 않는 순수한 LINQ 쿼리 :

var row = testElement 
    .Descendants("sheetData") 
    .Descendants("row") 
    .Where(x => x.Attribute("r").Value == "2") 
    .FirstOrDefault(); 
+0

이 곳 XPathSelectElements 정의 생각? 확장 메소드 인 경우 네임 스페이스를 게시하십시오. XElement에 추가하고 싶습니다. :) – eglasius

+0

. 사용할 것입니다. .Where (x => (문자열) x.Attribute ("r") == "2") 대신 . 'r' 속성이 없으면 NullReferenceException을 발생시키지 않습니다. –

+0

발견 : http://msdn.microsoft.com/en-us/library/bb342176.aspx ... +1 아주 좋은 :) - 나는 분명히이 하나 꽤 사용합니다 – eglasius

1
//if sheetData appears multiple times 
    XElement rowElement = testElement 
     .Descendants("sheetData") 
     .SelectMany(s=>s.Descendats("row)) 
     .Where(i=>i.Attribute("r").Value == rowNumber.ToString()); 
//if sheetData appears once 
    XElement rowElement = testElement 
     .Element("sheetData") 
     .Descendants("row)) 
     .Where(i=>i.Attribute("r").Value == rowNumber.ToString()); 
0

코드에서 선택 절은 중복되지 않습니다? 이미 IEnumerable<XElement>을 반환합니다. 나는

var row = testElements.Descendents("row").Where(e => (int)e.Attribute("r") == rowNumber).SingleOrDefault(); 

당신이 원하는 일을해야