2010-05-14 5 views
9

Dans LINQPad, existe-t-il un moyen d'accéder à la table SYSOBJECTS ou aux diverses vues INFORMATION_SCHEMA.xxx à l'aide de LINQ?Dans LINQPad pouvez-vous accéder à SYSOBJECTS en utilisant LINQ?

Je passe beaucoup de temps à chercher dans notre énorme base de données de sociétés pour trouver des noms partiels car il y a trop de tables et de procédures stockées pour en retenir le nom.

Je sais que je peux entrer et exécuter SQL dans LINQPad mais je voudrais faire dans LINQ au lieu de SQL comme LINQ est plus amusant :)

Merci

Xanthalas

+4

Cochez simplement «Inclure les vues système et les SP» dans les propriétés de connexion. Vous verrez ensuite toutes les vues système et les SP dans l'explorateur de schéma, que vous pouvez cliquer avec le bouton droit de la souris pour lancer une requête. –

+0

Je ne vois pas la prise en charge de 'System Views and SPs' dans SQL Azure? Cela vient-il dans de nouvelles versions? –

Répondre

0

créer une nouvelle table avec le contenu de SYSOBJECTS puis effectuer des recherches dans la nouvelle table

select * into SYSOBJECTS_COPY from SYS.OBJECTS 

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

Le seul inconvénient que je peux voir à ceci est que la copie deviendrait obsolète que les changements ont été apportés à la base de données et auraient donc besoin d'actualiser périodiquement. Ce ne serait pas un gros problème pour moi, donc c'est une bonne solution. Merci, gweddington. – Xanthalas

+1

C'est un bon point, il serait probablement préférable de créer une vue au lieu d'une table. – gweddington

0
from d in Databases 
select d 

lorsque la connexion à la base de données dans LINQPad pointe vers la base de données principale.

+0

Cela retournera toutes les bases de données sur le serveur, mais cela ne me permettra pas de rechercher des tables dans l'une de ces bases de données. Ce que je voudrais, c'est l'équivalent LINQ de "select * from SYSOBJECTS où le nom comme '% partialName%' et xtype = 'U'". Merci. – Xanthalas

5

Vous pouvez également intégrer SQL dans vos déclarations LINQ comme ceci:

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

Par défaut LINQPad doesn N'utilisez pas une police à espacement fixe pour les résultats, mais vous pouvez facilement la modifier en collant le bit de css suivant dans "Edition -> Préférences -> Résultats -> Éditeur de lancement"

body { Famille de police: Consolas, monospace; }

+0

Je ne savais pas que vous pouviez le faire avec LINQ; c'est pratique. Merci Nick. – Xanthalas

0

Ce code renvoie également les définitions d'objet et vous permet de rechercher dans la définition si vous le souhaitez.

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

Oui, vous pouvez.

Tout ce que vous avez à faire est également une vue sur le système et SPs dans le cadre sélectionné et utiliser LINQ comme suit:

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

ou en utilisant directement sys.Views [exemple renvoie toutes les tables avec des colonnes contenant la chaîne « personne »] :

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

en plus de @ réponse de Nick, here est un extrait qui génère des informations de table démarquage et ouvre dans le code VS. Mise à jour: depuis que cette question a été postée, LINQPad a été mis à jour pour permettre l'interrogation nativement des tables système.

Questions connexes