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

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

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

像“MS_Description”等等? 不是AFAIK; 你可以编写一个与数据库中的商店对话的SP(获取数据库对象名称和列名),并通过数据上下文查询 – 但内置任何内容。

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

  public static string GetProperty( this TContext ctx, Expression> 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"); 

由你决定的不那么hacky。 另请注意,您需要将所有者拆分为tableName

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

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

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

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