不正确/冗余where子句

时间:2014-04-27 04:29:33

标签: c#-4.0 linq-to-xml

我不是最好的Linq,我写了下面的查询,看来我的where子句是多余的,必须有更好的方法吗?

给出以下XML结构:

<Views>
  <Fulfillment>
    <SecurityRoleName>ABCD</SecurityRoleName>
      <SecurityRoleViews>
        <RoleView name="A" />
        <RoleView name="B" />
        <RoleView name="C" />
        <RoleView name="D" />
        <RoleView name="E" />
        <RoleView name="F" />
      </SecurityRoleViews>
      <PublicRoleViews>
        <RoleView name="Z" />
        <RoleView name="Y" />
        <RoleView name="X" />
        <RoleView name="W" />
        <RoleView name="V" />
        <RoleView name="U" />
      </PublicRoleViews>
    </Fulfillment>
</Views>

我编写了以下内容以获取单个值(FulfillmentRoleName)和两个List(SecuredViews,PublicViews)对象。

FulfillmentRoleName = configParms.Descendants("Fulfillment")
                                    .Where(node => (string)node.Element("SecurityRoleName") == "SecurityRoleName")
                                    .Select(node => node.Value.ToString())
                                    .First();


SecuredViews = configParms.Descendants("SecurityRoleViews")
                            .Where(node => (string)node.Element("RoleView") == "RoleView")
                            .Select(node => node.Attribute("name").Value.ToString())
                            .ToList();


PublicViews = configParms.Descendants("PublicRoleViews")
                            .Where(node => (string)node.Element("RoleView") == "RoleView")
                            .Select(node => node.Attribute("name").Value.ToString())
                            .ToList();

我想要以下值:

FulfillmentRoleName = ABCD

SecuredViews =名称列表A,B,C ......

PublicViews =名称列表Z,Y,X ....

这是我不确定的where子句:

.Where(node => (string)node.Element("RoleView") == "RoleView")

似乎必须有一种更优雅的方式来定位该节点吗?

感谢您抽出宝贵时间提供帮助


根据Ahmad Mageed的建议,我使用更优雅的元素(“”)方法。但是我得到一个实例化错误......好像元素集合还没有构建?

enter image description here

但是,如果我使用configParms.Root.Value,我会得到我的SecurityRoleName值???

我原以为视图会是根....或者它是第一个有值???

的节点

1 个答案:

答案 0 :(得分:1)

您可以使用Elements方法并提供要匹配的名称。这样您就可以使用Elements("RoleView")替换where查询。

其他一些观察结果:

  • 您可以使用Element方法直接抓取“Fulfillment”元素,而不是Descendants来简化第一个查询。
  • Value属性返回一个字符串。 ToString()电话是多余的。

以下是您的查询的更新版本:

// if configParms is an XDocument use configParms.Root
var securityRoleName = configParms.Element("Fulfillment")
                                  .Element("SecurityRoleName").Value;

var securedViews = configParms.Descendants("SecurityRoleViews")
                            .Elements("RoleView")
                            .Select(node => node.Attribute("name").Value)
                            .ToList();

var publicViews = configParms.Descendants("PublicRoleViews")
                            .Elements("RoleView")
                            .Select(node => node.Attribute("name").Value)
                            .ToList();