2010-05-14 14 views
9

In LINQPad esiste un modo per accedere alla tabella SYSOBJECTS o alle varie viste INFORMATION_SCHEMA.xxx utilizzando LINQ?In LINQPad puoi accedere a SYSOBJECTS usando LINQ?

Trascorro molto tempo a cercare attraverso il nostro enorme database aziendale per nomi parziali in quanto vi sono troppe tabelle e stored procedure per ricordare i nomi di tutti.

so di poter entrare e l'esecuzione di SQL in LINQPad ma mi piacerebbe farlo in LINQ, invece di SQL come LINQ è più divertente :)

Grazie

Xanthalas

+4

Aggiornamento: poiché questa domanda è stata pubblicata, LINQPad è stato aggiornato per consentire l'interrogazione delle tabelle di sistema in modo nativo. Basta selezionare "Includi visualizzazioni di sistema e SP" nelle proprietà di connessione; vedrai quindi tutte le viste di sistema e gli SP in Esplora schema, che puoi fare clic con il pulsante destro del mouse per eseguire una query. –

+0

Non vedo il supporto per "System Views and SPs" in SQL Azure? Sta arrivando in nuove versioni? –

risposta

0

creare una nuova tabella con il contenuto di SYSOBJECTS e quindi cercare all'interno della nuova tabella

select * into SYSOBJECTS_COPY from SYS.OBJECTS 

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

L'unico lato negativo che posso vedere è che la copia diventerebbe obsoleta mentre venivano apportate modifiche al database e quindi sarebbe necessario aggiornarlo periodicamente. Questo non sarebbe un grosso problema per me, quindi è una buona soluzione. Grazie gweddington. – Xanthalas

+1

Questo è un buon punto, probabilmente sarebbe meglio creare una vista invece di una tabella. – gweddington

0
from d in Databases 
select d 

quando la connessione al database in LINQPad punta al database principale.

+0

Ciò restituirà tutti i database sul server ma non mi consentirà di cercare tabelle all'interno di uno di quei database. Quello che vorrei è l'equivalente LINQ di "select * from SYSOBJECTS dove nome come '% partialName%' e xtype = 'U'". Grazie. – Xanthalas

5

È anche possibile incorporare SQL in sue dichiarazioni LINQ in questo modo:

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

Per impostazione predefinita LINQPad doesn utilizzare un font monospaziato per i risultati, ma puoi facilmente modificarlo incollando il seguente bit di css in "Modifica -> Preferenze -> Risultati -> Avvia editor"

corpo { font-family: Consolas, monospace; }

+0

Non sapevo che potessi farlo con LINQ; è a portata di mano. Grazie Nick. – Xanthalas

0

Questo codice restituisce anche le definizioni dell'oggetto e consente di cercare all'interno della definizione se lo si desidera.

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ì, è possibile.

Tutto quello che dovete fare è includere viste di sistema e SP in collegamento scelto e usare LINQ come segue:

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

o utilizzando direttamente sys.Views [esempio restituisce tutte le tabelle con le colonne contenenti stringa "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

Oltre a @ risposta di Nick, here è un frammento che genera informazioni sulla tabella di mark-down e lo apre in codice VS.

Problemi correlati