搜索列名称和表

时间:2016-01-22 09:10:57

标签: linqpad

有没有办法在数据库中搜索linqpad中的列名或表。我正在寻找一个类似的功能,你可以通过红门sql搜索获得SSMS。

2 个答案:

答案 0 :(得分:2)

您可以从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();

因此,过滤此查询应该很简单。

答案 1 :(得分: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\r!@#$%^&*()-=+[]{};':\",.<>/?\\|`~".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;
    }
}