我不是最好的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的建议,我使用更优雅的元素(“”)方法。但是我得到一个实例化错误......好像元素集合还没有构建?
但是,如果我使用configParms.Root.Value,我会得到我的SecurityRoleName值???
我原以为视图会是根....或者它是第一个有值???
的节点答案 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();