2010-05-14 75 views
9

在LINQPad中,有什麼方法可以使用LINQ訪問SYSOBJECTS表或各種INFORMATION_SCHEMA.xxx視圖?在LINQPad中,您可以使用LINQ訪問SYSOBJECTS嗎?

我花了很多時間在我們龐大的公司數據庫中搜索部分名稱,因爲有太多的表和存儲過程要記住它們的名稱。

我知道我可以進入並在LINQPad運行SQL,但我想這樣做的LINQ而不是SQL的LINQ是更多的樂趣:)

感謝

Xanthalas

+4

更新:自從發佈此問題後,LINQPad已更新以允許本地查詢系統表。只需檢查連接屬性中的「包含系統視圖和SP」;然後您將看到Schema Explorer中的所有系統視圖和SP,您可以右鍵單擊該查看。 – 2011-02-08 02:11:28

+0

我沒有在SQL Azure中看到對「系統視圖和SP」的支持?這是新版本嗎? – 2011-09-03 00:27:39

回答

0

創建SYSOBJECTS內容的新表,然後將新表中搜索

select * into SYSOBJECTS_COPY from SYS.OBJECTS 

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

我可以看到的唯一不足之處是副本將會隨着對數據庫的更改而變得陳舊,因此需要定期刷新。這對我來說不是什麼大問題,但這是一個很好的解決方案。謝謝gweddington。 – Xanthalas 2010-08-28 09:10:43

+1

這是一個好點,它可能會更好地創建一個視圖,而不是一個表。 – gweddington 2010-08-30 13:55:42

0
from d in Databases 
select d 

當LINQPad中的數據庫連接指向master數據庫時。

+0

這將返回服務器上的所有數據庫,但它不允許我在其中一個數據庫中搜索表。我想要的是LINQ等價於「select * from SYSOBJECTS」的名稱,如'%partialName%'和xtype ='U'「。謝謝。 – Xanthalas 2010-05-14 13:19:43

5

您還可以嵌入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,monospace; }

+0

我不知道你可以用LINQ來做到這一點;這很方便。謝謝Nick。 – Xanthalas 2010-10-11 15:13:23

0

此代碼還返回對象定義,並允許您在定義內搜索是否需要。

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

是的,你可以。

所有你需要做的是包括在選擇連接系統的觀點和SP和使用LINQ類似以下內容:

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

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

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

除了@尼克的回答是,here的是,在降價生成表信息,並打開它在VS的代碼片段。

相關問題