Можно ли в LINQPad получить доступ к SYSOBJECTS с помощью LINQ?

Есть ли в LINQPad какой-либо способ доступа к таблице SYSOBJECTS или различным представлениям INFORMATION_SCHEMA.xxx с помощью LINQ?

Я трачу много времени на поиск частичных имен в нашей огромной базе данных компании, так как существует слишком много таблиц и хранимых процедур, чтобы запомнить их все имена.

Я знаю, что могу вводить и запускать SQL в LINQPad, но я хотел бы сделать это в LINQ вместо SQL, так как LINQ веселее :)

Спасибо

Ксанталас


person Xanthalas    schedule 14.05.2010    source источник
comment
Обновление: поскольку этот вопрос был опубликован, LINQPad был обновлен, чтобы разрешить запросы к системным таблицам изначально. Просто отметьте «Включить системные представления и SP» в свойствах соединения; после этого вы увидите все системные представления и SP в Schema Explorer, который вы можете щелкнуть правой кнопкой мыши, чтобы запросить.   -  person Joe Albahari    schedule 08.02.2011
comment
Я не вижу поддержки «Системные представления и SP» в SQL Azure? Это будет в новых версиях?   -  person Igor Dvorkin    schedule 03.09.2011


Ответы (6)


создайте новую таблицу с содержимым SYSOBJECTS, а затем выполните поиск в новой таблице

select * into SYSOBJECTS_COPY from SYS.OBJECTS

from o in SYSOBJECTS_COPY.AsEnumerable()
where Regex.IsMatch( d.Name, "partialName", RegexOptions.IgnoreCase )
select o
person gweddington    schedule 27.08.2010
comment
Единственный недостаток, который я вижу в этом, заключается в том, что копия устареет, поскольку в базу данных были внесены изменения, и поэтому ее нужно будет периодически обновлять. Для меня это не будет большой проблемой, так что это хорошее решение. Спасибо, Гведдингтон. - person Xanthalas; 28.08.2010
comment
Это хороший момент, наверное, лучше было бы создать представление вместо таблицы. - person gweddington; 30.08.2010

Да, ты можешь.

Все, что вам нужно сделать, это включить системные представления и 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()
person karol    schedule 09.01.2013

Вы также можете встроить 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 в «Правка -> Настройки -> Результаты -> Запустить редактор»

body {font-family: Consolas, моноширинный; }

person Nick Knowlson    schedule 13.09.2010
comment
Я не знал, что вы можете сделать это с помощью LINQ; это удобно. Спасибо, Ник. - person Xanthalas; 11.10.2010

Этот код также возвращает определения объектов и позволяет при желании выполнять поиск внутри определения.

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;
    } 
person BraveNewMath    schedule 06.04.2012

from d in Databases
select d

когда соединение с базой данных в LINQPad указывает на основную базу данных.

person netmatrix01    schedule 14.05.2010
comment
Это вернет все базы данных на сервере, но не позволит мне искать таблицы в одной из этих баз данных. Мне нужен LINQ-эквивалент select * from SYSOBJECTS, где имя вроде «% partialName%» и xtype = «U». Спасибо. - person Xanthalas; 14.05.2010

В дополнение к ответу @ Nick, здесь представляет собой фрагмент, который генерирует информацию о таблице в Markdown и открывает ее. в VS Code.

person the_joric    schedule 17.05.2017