2010-05-14 17 views
9

En LINQPad, ¿hay alguna forma de acceder a la tabla SYSOBJECTS o a las diversas vistas INFORMATION_SCHEMA.xxx utilizando LINQ?En LINQPad, ¿puede acceder a SYSOBJECTS utilizando LINQ?

Paso mucho tiempo buscando en la enorme base de datos de mi compañía nombres parciales, ya que hay demasiadas tablas y procedimientos almacenados para recordar los nombres de todos ellos.

Sé que puedo entrar y ejecutar SQL en LINQPad pero me gustaría hacer esto en LINQ en lugar de SQL como LINQ es más divertido :)

Gracias

Xanthalas

+4

Actualización: desde que se publicó esta pregunta, LINQPad se ha actualizado para permitir la consulta de las tablas del sistema de forma nativa. Simplemente marque 'Incluir vistas del sistema y SP' en las propiedades de conexión; A continuación, verá todas las vistas del sistema y los SP en el Explorador de esquemas, que puede hacer clic con el botón derecho para consultar. –

+0

No veo soporte para 'Vistas del sistema y SP' en SQL Azure? ¿Eso viene en nuevas versiones? –

Respuesta

0

crear una nueva tabla con el contenido de SYSOBJECTS y luego buscar dentro de la nueva tabla

select * into SYSOBJECTS_COPY from SYS.OBJECTS 

from o in SYSOBJECTS_COPY.AsEnumerable() 
where Regex.IsMatch(d.Name, "partialName", RegexOptions.IgnoreCase) 
select o 
+0

El único inconveniente que puedo ver en esto es que la copia quedaría obsoleta a medida que se realizaban cambios en la base de datos y, por lo tanto, tendría que actualizarse periódicamente. Esto no sería un gran problema para mí, así que es una buena solución. Gracias gweddington. – Xanthalas

+1

Ese es un buen punto, probablemente sería mejor crear una vista en lugar de una tabla. – gweddington

0
from d in Databases 
select d 

cuando la conexión de la base de datos en LINQPad apunta a la base de datos maestra.

+0

Eso devolverá todas las bases de datos en el servidor pero no me permitirá buscar tablas dentro de una de esas bases de datos. Lo que me gustaría es el equivalente LINQ de "select * from SYSOBJECTS", donde el nombre es '% partialName%' y xtype = 'U' ". Gracias. – Xanthalas

5

También puede incrustar SQL en sus estados de LINQ, así:

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... 
} 

Por defecto LINQPad doesn No utilice una fuente monoespaciada para los resultados, pero puede cambiarla fácilmente pegando el siguiente bit de css en "Editar -> Preferencias -> Resultados -> Editor de inicio"

cuerpo { font-family: Consolas, monoespacio; }

+0

No sabía que pudieras hacer eso con LINQ; eso es práctico. Gracias Nick. – Xanthalas

0

Este código también devuelve las definiciones del objeto y le permite buscar dentro de la definición si lo desea.

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

Sí, puedes.

Todo lo que tiene que hacer es incluir vistas del sistema y los SP en conexión seleccionada y utilizar LINQ como siguiente:

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

o usar directamente sys.Views [ejemplo devuelve todas las tablas con columnas que contienen la cadena "persona"] :

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() 
0

Además de @ respuesta de Nick, here es un fragmento de código que genera datos de esta tabla en la reducción del precio y lo abre en Código VS.

Cuestiones relacionadas