Получить SiteMapNode соответствующий пользовательский атрибут, используя LINQ - PullRequest
1 голос
/ 26 января 2012

Я новичок в LINQ. У меня есть обычный XML-документ siteMap с пользовательскими атрибутами. Один из этих атрибутов: id

Я хотел бы использовать LINQ для извлечения одного узла, соответствующего значению пользовательского атрибута (id).

и т.д.

Моя попытка LINQ выглядит следующим образом:

private SiteMapNode FindNodeById(SiteMapNodeCollection nodes, int siteMapNodeId)
{
    var pageNode = from SiteMapNode node in nodes.Cast<SiteMapNode>()
                   where node["id"] == Convert.ToString(siteMapNodeId)
                   select node;

    return (SiteMapNode)pageNode;
}

Во время отладки pageNode назначается с:

{System.Linq.Enumerable.WhereEnumerableIterator<System.Web.SiteMapNode>}

И в операторе возврата генерируется исключение InvalidCastException:

Unable to cast object of type 'WhereEnumerableIterator`1[System.Web.SiteMapNode]' to type 'System.Web.SiteMapNode'.

Любая помощь приветствуется! :)

РЕДАКТИРОВАТЬ: я переформулировал этот вопрос в более ясной форме здесь: Переформулированный вопрос

Спасибо Стефану за то, что поставил меня на правильный путь!

Ответы [ 2 ]

1 голос
/ 26 января 2012

Вы пытаетесь разыграть IEnumerable<SiteMapNode> до SiteMapNode. Используйте First для фильтрации и возврата одного узла:

return nodes
  .Cast<SiteMapNode>()
  .First(node => node["id"] == Convert.ToString(siteMapNodeId));
0 голосов
/ 26 января 2012

pageNode - это последовательность узлов.

Вы хотите позвонить First(), чтобы получить первый элемент в последовательности.

...