【问题标题】:In LINQPad can you access SYSOBJECTS using LINQ?在 LINQPad 中,您可以使用 LINQ 访问 SYSOBJECTS 吗?
【发布时间】:2010-05-14 10:08:38
【问题描述】:

在 LINQPad 中是否有任何方法可以使用 LINQ 访问 SYSOBJECTS 表或各种 INFORMATION_SCHEMA.xxx 视图?

我花了很多时间在我们庞大的公司数据库中搜索部分名称,因为表和存储过程太多,无法记住所有名称。

我知道我可以在 LINQPad 中输入和运行 SQL,但我想在 LINQ 而不是 SQL 中执行此操作,因为 LINQ 更有趣:)

谢谢

黄原体

【问题讨论】:

  • 更新:自从发布此问题以来,LINQPad 已更新为允许本机查询系统表。只需在连接属性中选中“包括系统视图和 SP”;然后,您将在 Schema Explorer 中看到所有系统视图和 SP,您可以右键单击进行查询。
  • 我在 SQL Azure 中看不到对“系统视图和 SP”的支持?这是新版本吗?

标签: .net linq linqpad


【解决方案1】:

是的,你可以。

您所要做的就是在选定的连接中包含系统视图和 SP,并使用 LINQ,如下所示:

sys.Sysobjects.Where(sp => sp.Xtype == "P")  // returns SPs
sys.Sysobjects.Where(t => t.Xtype == "U")    // returns Tables

或直接使用 sys.Views [示例返回所有列包含字符串“person”的表]:

sys.Tables.Join(sys.Columns,
                t => t.Object_id,
                c => c.Object_id,
                (t, c) => new { t, c })
    .Where(x => x.c.Name.Contains("person"))
    .Select(x => new { ObjName = x.t.Name,
                       ChildName = x.c.Name } )
            .Distinct()

【讨论】:

    【解决方案2】:

    您还可以像这样将 SQL 嵌入到您的 LINQ 语句中:

    void Main()
    {
        var matches = this.ExecuteQuery<SysObject>("SELECT name, type_desc AS "
                    + "TypeDesc FROM [sys].[objects]");
    
        foreach(var match in matches)
            Console.WriteLine("{0,-30}{1}", (match.Name + ":"), match.TypeDesc);
    }
    
    // Define other methods and classes here
    class SysObject
    {
        public string Name;
        public string TypeDesc;
        // etc...
    }
    

    默认情况下,LinqPad 不使用等宽字体来显示结果,但您可以通过将以下 css 粘贴到“编辑 -> 首选项 -> 结果 -> 启动编辑器”中轻松更改它

    身体{ 字体系列:Consolas,等宽; }

    【讨论】:

    • 我不知道你可以用 LINQ 做到这一点;这很方便。谢谢尼克。
    【解决方案3】:

    使用 SYSOBJECTS 的内容创建一个新表,然后在新表中搜索

    select * into SYSOBJECTS_COPY from SYS.OBJECTS
    
    from o in SYSOBJECTS_COPY.AsEnumerable()
    where Regex.IsMatch( d.Name, "partialName", RegexOptions.IgnoreCase )
    select o
    

    【讨论】:

    • 我能看到的唯一缺点是副本会随着对数据库的更改而过时,因此需要定期刷新。不过,这对我来说没什么大不了的,所以这是一个很好的解决方案。谢谢格威丁顿。
    • 这很好,创建视图而不是表可能会更好。
    【解决方案4】:

    此代码还返回对象定义,并允许您根据需要在定义中进行搜索。

    void Main()
        {
            var matches = FetchObjects(true);
    
            var searchTerm = "tblName"; //<--Change this to filter for what you are looking for
            bool searchName = true; //search the object name
            bool searchDef = false; //search inside object definition (ie the stored procedure definition)
            TypeDescs typeDesc = TypeDescs.Any; //specify whether you want to limit your search to tables or stored procedures
    
            matches
                .Where(x=> (
                    (searchName && x.Name.Contains(searchTerm)) 
                    || (searchDef && (x.ObjectDefinition!=null && x.ObjectDefinition.Contains(searchTerm))) )
                    && (typeDesc==TypeDescs.Any || x.TypeDesc == typeDesc.ToString())
    
                    )
                .Select(x=> new {x}).Dump();
    
        }
        IEnumerable<SysObject> FetchObjects(bool includeDefinitions){
             return this.ExecuteQuery<SysObject>("SELECT Name=convert(varchar(30), name), type_desc AS " 
                        + " TypeDesc "
                        + string.Format(", ObjectDefinition={0}", (includeDefinitions)?"OBJECT_DEFINITION (OBJECT_ID(name))":"NULL")
                        + " FROM [sys].[objects]");
        }
        enum TypeDescs {Any, SQL_STORED_PROCEDURE, USER_TABLE}
        class SysObject 
        { 
            public string Name; 
            public string TypeDesc; 
            public string ObjectDefinition;
        } 
    

    【讨论】:

      【解决方案5】:
      from d in Databases
      select d
      

      当 LINQPad 中的数据库连接指向主数据库时。

      【讨论】:

      • 这将返回服务器上的所有数据库,但不允许我在其中一个数据库中搜索表。我想要的是 LINQ 等效于“从 SYSOBJECTS 中选择 *,其中名称类似于 '%partialName%' 和 xtype = 'U'”。谢谢。
      【解决方案6】:

      除了@Nick 的回答,here 是一个sn-p,它在markdown 中生成表信息并在VS Code 中打开。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-27
        • 2010-09-25
        • 2020-07-01
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多