2013-02-05 2 views
1

어떻게이 쿼리를 최적화 할 수 있습니까 & 람다로 변환 하시겠습니까?Linq 쿼리 최적화

XElement xde = new XElement("Elements", (from a in rootElement.Elements("Class") 
        where a.Attribute("Location").Value.Equals("FirstFloor") 
        select (from b in a.Elements("Subject") 
          where b.Attribute("Notify").Value.Equals("001") 
          select b.Elements()))); 
+1

Dude 심각하게 http://stackoverflow.com/faq#howtoask –

+1

무엇이 최적화되고 싶습니까? 가독성? 공연? 방어력? 또한 현재 어떤 문제가 있는지 설명하십시오. –

답변

3

성능면에서 볼 때 쿼리를 최적화 할 수 없다고 생각합니다.

Hoewever

당신은 ==하여 더 읽기 repacing Equals하게하고 불필요한 select

XElement xde = 
     new XElement("Elements", (from a in rootElement.Elements("Class") 
            where a.Attribute("Location").Value == "FirstFloor" 
            from b in a.Elements("Subject") 
            where b.Attribute("Notify").Value == "001" 
            select b.Elements())); 
2

제거 할 수 할 수 있습니다 대신 노드의 값을 읽는 string 단순히 경우 노드입니다. 따라서 XML에 누락 된 특성이 있으면 예외를 피할 수 있습니다.

XElement xde = 
    new XElement("Elements", 
     from c in rootElement.Elements("Class") 
     where (string)c.Attribute("Location") == "FirstFloor" 
     from s in c.Elements("Subject") 
     where (string)s.Attribute("Notify") == "001" 
     select s.Elements()); 

도 (한 줄에 맞게 모든 쿼리) XPath를 사용하는 것이 좋습니다 :

new XElement("Elements", rootElement 
.XPathSelectElements("Class[@Location='FirstFloor']/Subject[@Notify='001']/*")); 

또한 당신이 요소 이름에 해당하는 범위 변수 이름 (가독성)를 사용하는 것이 좋습니다

람다 (메서드 구문도 원함) :

new XElement("Elements", 
    rootElement.Elements("Class") 
       .Where(c => (string)c.Attribute("Location") == "FirstFloor") 
       .Elements("Subject") 
       .Where(s => (string)s.Attribute("Notify") == "001") 
       .Elements());