我有一个SQL表,每列都有扩展属性。
有没有办法使用Linq2SQL在c#中从LINQ访问这些?
答案 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版本)方式。