如何按字母顺序对DBML对象进行排序?

时间:2010-10-28 15:59:03

标签: c# linq-to-sql or-designer

我的项目中有一个包含所有LinqToSql对象的DBML文件。最初我从数据库导入它们,一切都很顺利。现在,随着我的数据库一直在增长,我一直在O / R设计器中将新表添加到图表中,但它们总是附加到XML的末尾。这有点痛苦,因为当我定义外键时,它总是按照它们在XML中出现的顺序列出可用的表。

如何根据表名按字母顺序对XML表声明进行排序?

2 个答案:

答案 0 :(得分:1)

一种可能的解决方案是编写一个读取XML的小应用程序,根据自己的喜好对其进行排序并输出更新后的版本。

答案 1 :(得分:1)

我知道这是旧的,但我也想在我的DBML中对表和函数进行排序,以使其在Git中更易于管理。以下控制台应用程序代码似乎运行良好。您可以将DBML文件拖放到exe上,也可以在项目中设置bat文件或构建事件。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace DbmlSorter
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
                return;

            var fileName = args[0];

            try
            {
                if (!File.Exists(fileName))
                    return;

                SortElements(fileName);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

            Console.WriteLine();
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }

        private static void SortElements(string fileName)
        {
            var root        = XElement.Load(fileName);

            var connections = new SortedDictionary<string, XElement>();
            var tables      = new SortedDictionary<string, XElement>();
            var functions   = new SortedDictionary<string, XElement>();
            var others      = new SortedDictionary<string, XElement>();

            foreach (var element in root.Elements())
            {
                var key = element.ToString();

                if (key.StartsWith("<Connection"))
                    connections.Add(key, element);

                else if (key.StartsWith("<Table"))
                    tables.Add(key, element);

                else if (key.StartsWith("<Function"))
                    functions.Add(key, element);

                else
                    others.Add(key, element);
            }

            root.RemoveNodes();

            foreach (var pair in connections)
            {
                root.Add(pair.Value);

                Console.WriteLine(pair.Key);
            }

            foreach (var pair in tables)
            {
                root.Add(pair.Value);

                Console.WriteLine(pair.Key);
            }

            foreach (var pair in functions)
            {
                root.Add(pair.Value);

                Console.WriteLine(pair.Key);
            }

            foreach (var pair in others)
            {
                root.Add(pair.Value);

                Console.WriteLine(pair.Key);
            }

            root.Save(fileName);
        }
    }
}