2

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

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

4

3 回答 3

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);
    }

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

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

更新:是的,这有点用;例子:

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

First()很痛苦,但没有两个选择器那么难看;不过,它可以这样重写:

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

由你决定哪个不那么hacky。另请注意,您需要将所有者从tableName.

于 2009-09-28T11:22:03.190 回答
0

你想以什么方式访问它们?我的 VS 2008 的 L2S 插件可以将它们转换为 xml 文档注释(因此它们显示在 VS intellisense 中)和描述属性[您可以从代码中访问]。请参阅http://www.huagati.com/dbmltools/上的“从数据库更新文档”功能...

于 2009-09-28T16:22:55.630 回答
0

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

Alternatively you could use SMO to access all your SQL Server metadata, including extended properties on tables, columns etc. That will be LINQ to Objects though I believe. By the way this is the only portable (across SQL Server versions) way to query this information.

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

于 2011-11-07T21:01:56.910 回答