2014-04-27 5 views
1

Я не лучший 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) и два списка (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(node => (string)node.Element("RoleView") == "RoleView") 

Кажется, должен быть более элегантный способ найти этот узел?

Спасибо, что нашли время, чтобы помочь


В соответствии с рекомендацией Ahmad Mageed Я использую более изящный элемент («») подход. Однако я получаю ошибку создания экземпляра ... как будто коллекция элементов еще не построена ??

enter image description here

Однако, если я использую configParms.Root.Value Я получаю значение SecurityRoleName ???

Я бы подумал, что представления будут корнем .... или это первый узел, который имеет значение ???

ответ

1

Вы можете использовать метод Elements и предоставить имя для соответствия. Это позволит вам заменить запрос where Elements("RoleView").

Некоторые другие наблюдения:

  • Вы можете упростить первый запрос, захватывая элемент «выполнение» непосредственно с помощью метода Element, вместо 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(); 
+0

Два списка запросов имеют смысл и именно то, что я был после. Спасибо! Один вопрос относительно первого запроса. Мне нужно спуститься по дереву узлов из Fulfillment в SecurityRoleName и т. Д. Я предполагаю, что вы, вероятно, просто подскочили к нему в вашем примере ...... configParms.Element («SecurityRoleName»). Значение – GPGVM

+1

@ user1278561 Да , используя «Элемент», я иду от корня, к выполнению, затем снова в SecurityRoleName.'Descendants (" SecurityRoleName ")' позволят вам захватить все узлы этого имени, не пройдя узлы, но возвращает 'IEnumerable', что приведет к более длинному запросу с' First'/'Single' в конце (аналогично что вы изначально имели). Так как это действительно один элемент, подход «Элемент» является более четким и более прямым. –

+0

Ну ... Я что-то упускаю. См. Мое редактирование. – GPGVM