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(所有查询都适合一行):

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 回答