从C#中的LINQ中提取SQL列扩展属性

时间:2009-09-28 11:17:58

标签: c# sql linq-to-sql extended-properties

我有一个SQL表,每列都有扩展属性。

有没有办法使用Linq2SQL在c#中从LINQ访问这些?

3 个答案:

答案 0 :(得分:1)

“MS_Description”之类的东西等?不是AFAIK;你可以编写一个与数据库中的商店对话的SP(获取数据库对象名和列名),并通过数据上下文查询 - 但没有内置。

编写一些使用Expression来获取要传入的数据库名称(而不是OO名称)的代码也很容易。例如:

    public static string GetProperty<TContext, TValue>(
        this TContext ctx, Expression<Func<TContext, TValue>> selector,
        string propertyName)
        where TContext : DataContext
    {
        MemberExpression me = selector.Body as MemberExpression;
        if (me == null) throw new InvalidOperationException();
        var member = me.Member;
        var objType = me.Expression.Type;
        var metaType = ctx.Mapping.GetMetaType(objType);
        string tableName = metaType.Table.TableName;
        string columnName = metaType.GetDataMember(member).MappedName;

        return ctx.GetProperty(tableName, columnName, propertyName);
    }

(或类似的东西;只需启动测试数据库......)

通过映射的SPROC提供GetProperty方法的位置。

更新:是的,那种方式有效;例如:

string desc = ctx.GetProperty(x => x. DataChanges.First().Change, "MS_Description");

First()是一种痛苦,但不如拥有两个选择者那么难看;但是可以这样重写:

string desc = ctx.GetProperty(x => x.DataChanges, dc => dc.Change, "MS_Description");

由于你不那么黑客。另请注意,您需要将所有者拆分为tableName

答案 1 :(得分:0)

您想以什么方式访问它们?我的VS 2008的L2S加载项可以将它们转换为xml doc注释(因此它们显示在VS intellisense中),以及描述属性[可以从代码访问]。请参阅http://www.huagati.com/dbmltools/ ...

中的“从数据库更新文档”功能

答案 2 :(得分:0)

您可以在数据库中创建一个视图,从sys视图中选择所需的所有信息 - 从sys.extended_properties视图开始(在SQL2005及更高版本中),并根据需要加入其他视图(在您的情况下为sys.tables和sys.all_columns)我想。 然后只需在模型中的VS中导入该视图。

或者您可以使用SMO访问所有SQL Server元数据,包括表,列等的扩展属性。虽然我相信这将是LINQ to Objects。 顺便说一下,这是查询此信息的唯一可移植(跨SQL Server版本)方式。

http://msdn.microsoft.com/en-us/library/ms162557.aspx