1

このクエリを最適化して lambda に変換するにはどうすればよいですか?

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())));
4

2 に答える 2

3

パフォーマンスに関しては、クエリを最適化できないと思います。

ただし、不要な部分を置き換えて削除することで、読みやすくすることができ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()));
于 2013-02-05T12:57:04.923 に答える
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の使用も検討してください(すべてのクエリは1行に収まります)。

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

Lambda(メソッド構文も必要です):

new XElement("Elements", 
    rootElement.Elements("Class")
               .Where(c => (string)c.Attribute("Location") == "FirstFloor")
               .Elements("Subject")
               .Where(s => (string)s.Attribute("Notify") == "001")
               .Elements());
于 2013-02-05T13:02:55.710 に答える