2016-01-22 43 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