2016-01-22 110 views
0

有什麼方法可以在linqpad中搜索數據庫中的列名或表。我尋找一個類似的功能,你可以通過紅色大門SQL搜索在SSMS中獲得。搜索列名和表

回答

1

如果啓用下連接屬性系統表,您可以使用這樣的查詢(這是MS SQL,但你也許可以使其適應其他人)

void Main() 
{ 
    var text = "ThingToFind"; 

    SearchColumns(text).Dump("Columns: " + text); 
    SearchModules(text).Dump("Modules: " + text); 
} 

#region 
IEnumerable<dynamic> SearchColumns(string text) 
{ 
    return sys 
     .columns 
     .Join(sys.objects, o => o.object_id, i => i.object_id, (o, i) => new { Object = i, Column = o }) 
     .Join(sys.types, o => o.Column.user_type_id, i => i.user_type_id, (o, i) => new { o.Column, o.Object, Type = i }) 
     .Where(c => c.Object.type_desc != "INTERNAL_TABLE") 
     .Where(c => c.Object.type_desc != "SYSTEM_TABLE") 
     .OrderBy(c => c.Object.type) 
     .ThenBy(c => c.Object.name) 
     .Select(c => new { c.Object, c.Column, c.Type, Default = c.Column.default_object_id != 0 ? sys.default_constraints.Single(d => d.object_id == c.Column.default_object_id).definition : null }) 
     .Select(c => new { Table_Type = c.Object.type_desc, Table = c.Object.name, Name = c.Column.name, Type = c.Type.name, Length = c.Column.max_length, Precision = c.Column.precision, Scale = c.Column.scale, Nullable = c.Column.is_nullable, c.Default }) 
     .AsEnumerable() 
     .Where(c => c.Name.ContainsIgnoreCase(text)); 
} 

IEnumerable<dynamic> SearchModules(string text, bool findRelatedModules = false) 
{ 
    var modules = sys 
     .sql_modules 
     .AsEnumerable() 
     .Join(sys.objects, o => o.object_id, i => i.object_id, (o, i) => new { i.name, definition = o.definition.Trim() }) 
     .ToList(); 

    var result = modules 
     .Where(m => m.name.ContainsIgnoreCase(text) || m.definition.ContainsIgnoreCase(text)) 
     .ToList(); 

    while (findRelatedModules) 
    { 
     var add = result 
      .SelectMany(r => r.definition.Split(" \t\n\[email protected]#$%^&*()-=+[]{};':\",.<>/?\\|`~".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)) 
      .Distinct() 
      .Where(token => modules.Any(m => m.name.ToLower() == token.ToLower())) 
      .Where(token => !result.Any(m => m.name.ToLower() == token.ToLower())) 
      .ToList(); 

     result.AddRange(add.Select(a => modules.Single(m => m.name.ToLower() == a.ToLower()))); 

     findRelatedModules = add.Any(); 
    } 

    result 
     .Where(m => !m.definition.ContainsIgnoreCase(m.name)) 
     .Dump("Renamed Modules"); 

    return result.OrderBy(r => r.name); 
} 
#endregion 

public static class StringExtensions 
{ 
    public static bool ContainsIgnoreCase(this string source, string toCheck, bool bCaseInsensitive) 
    { 
     return source.IndexOf(toCheck, bCaseInsensitive ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal) >= 0; 
    } 
} 
1

你可以得到表和列Linq映射中的名稱。以下應該轉儲出表名和列名。

var columns = 
    (from t in this.Mapping.GetTables() 
    from dm in t.RowType.DataMembers 
    where dm.DbType != null 
    select new 
    { 
     TableName = t.RowType.Name , 
     TableSqlName = t.TableName, 
     dm.DbType, 
     ColumnName = dm.Name, 
     dm.IsPrimaryKey, 
     ColumnSqlName = dm.MappedName 
    } 

    ); 

    columns.Dump(); 

因此,它應該很簡單,過濾此查詢。

+0

我希望能像我在我的問題中提到的一個GUI工具(紅色大門SQL搜索)。 – user3711421