Как преобразовать иерархические данные базы данных в XML, используя ASP.net 3.5 и LINQ - PullRequest
3 голосов
/ 13 мая 2010

У меня есть таблица с иерархической структурой. как это:
альтернативный текст http://aspalliance.com/ArticleFiles/822/image002.gif

и данные таблицы показаны здесь:
альтернативный текст http://aspalliance.com/ArticleFiles/822/image003.gif
эта стратегия дает мне возможность иметь неограниченные категории и подкатегории.

Я использую ASP.net 3.5 SP1 и LINQ и MSSQL Server2005. Как преобразовать его в XML? Я могу сделать это с помощью объекта набора данных и метода " .GetXML () " но как это реализовать с помощью LINQtoSQL или LINQtoXML ??? или есть ли другой способ сделать это проще? что вы предлагаете? лучший способ? Я искал в Интернете, но ничего не нашел для .net 3.5 featuers.

Обновление вопроса
спасибо Мерф, но теперь у меня есть новая проблема. Я хочу сделать файл Dunamic SiteMap в моем проекте. Вы знаете, что файл SiteMap в ASP.net выглядит следующим образом:

<siteMapNode url="~/Category?cid=0" title="Home"  description="Home">

    <siteMapNode url="~/Category?cid=1" title="a"  description="" />

    <siteMapNode url="~/Category?cid=2" title="b"  description="" >

        <siteMapNode url="~/Category?cid=3" title="c"  description="" />

        <siteMapNode url="~/Category?cid=4" title="d"  description="" />

    </siteMapNode>
</siteMapNode>

Основная проблема заключается в том, что согласно Кодексу Мурфа подкатегории будут вложены в элемент. но в случае SiteMap у нас нет таких элементов, и все категории и подкатегории вложены в элементы. как я могу изменить код Mr.Murph для формирования этой схемы?

Ответы [ 2 ]

2 голосов
/ 15 мая 2010

спасибо, дорогой Мерф. Я использовал ваш код, и он работал хорошо. но, как вы говорите, вы не тестировали свой код, поэтому GetMenuXML() имел некоторые ошибки вот исправление:

private static XElement GetMenuXML(Menu menu)
{
    return new XElement("category", 
        new XAttribute("MenuID", menu.MenuID),
        new XAttribute("Text", menu.Text),
        new XElement("Description", menu.Description),
        new XElement("menus", menu.Menus.Select(m => GetMenuXML(m))));
} 
2 голосов
/ 13 мая 2010

Хорошо, очень быстро (и полностью не проверено).

Чтобы «свернуть свой» XML с использованием Linq to SQL и Linq to XML (которые являются общими .NET, а не ASP.NET) довольно просто, этого должно быть достаточно, учитывая несколько предположений, которые я подробно опишу после (сейчас немного изменен как предложено):

void Main()
{
    DataContext dc = new DataContext();

    menuXML = new XDocument();
    XElement root = new XElement("menuxml",
        from m in dc.Menus
        where m.ParentID == null
        select GetMenuXML(m));

    menuXML.Add(root);
    // You've now got an XML document that you can do with as you need
    // For test you can save...
    menuXML.Save("filename.xml");
}

private static XElement GetMenuXML(Menu menu) 
{ 
    return new XElement("category",  
        new XAttribute("MenuID", menu.MenuID), 
        new XAttribute("Text", menu.Text), 
        new XElement("Description", menu.Description), 
        new XElement("menus", menu.Menus.Select(m => GetMenuXML(m)))); 
}

Хорошо, сверху

  • Я предполагаю, что контекст данных Linq to SQL называется DataContext, в котором у вас есть таблица, сопоставленная с Меню, и что отношение родитель / потомок - ChildMenus на родительском конце.
  • Создаем новый документ
  • Мы создаем новый элемент, который будем использовать в качестве корневого, который мы будем называть menuxml
  • Затем мы выполняем запрос linq to SQL, чтобы выбрать все пункты меню, у которых нет родителя, и вызываем GetMenuXML, чтобы вывести XML для одной записи меню (то есть для этой записи и ее дочерних элементов) для этих записей.
  • GetMenuXML выводит одну запись меню, разделенную между атрибутами и элементами, единственное, что немного отличается, это то, что я использовал лямбовское выражение вместо подробного синтаксиса для генерации дочерних меню - но если я понял это правильно (не помню, чтобы тест!) это делает что-то вроде

from m in menu.ChildMenus select GetMenuXML(m)

Если это работает (!), Вы должны получить XML что-то вроде

<menuxml>
    <menu MenuID="1" Text="Product">
        <Description>A list of products</Description>
        <menus>
            <menu MenuID="6" Text="Background">
                <Description>Product Background</Description>
                <menus>
                    <menu MenuID="18" Text="Internet Restriction">
                        <Description>Internet Restriction</Description>
                        <!-- children if any would be here -->
                    </menu>
                    <menu MenuID="19" Text="Speed Solution">
                        <Description>Speed Solutions</Description>
                    </menu>
                </menus>
            </menu>
            <menu MenuID="7" Text="Background">
                <Description>Product Details</Description>
            </menu>
        </menus>
    </menu>
    <!-- rest of the top level menus -->
</menuxml>
...