我有一个SQL表,在每列上都有扩展的属性。
有没有办法使用Linq2SQL在c#中从LINQ访问这些文件?
诸如“MS_Description”之类的东西?不是AFAIK;您可以编写一个与数据库的存储进行对话的SP(获取数据库对象名称和列名称),然后通过数据上下文进行查询- 但没有内置内容。
编写一些Expression用于获取数据库名称(而不是OO名称)的代码也很容易。类似:
Expression
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提供方法的位置。
GetProperty
更新:是的,那有点奏效;例子:
string desc = ctx.GetProperty(x => x. DataChanges.First().Change, "MS_Description");
这First()是一个痛苦,但比必须要有两个选择器要丑陋得多。不过,可以这样重写它:
First()
string desc = ctx.GetProperty(x => x.DataChanges, dc => dc.Change, "MS_Description");
由您决定,这不太hack。另请注意,您需要将所有者从中分离出来tableName。
tableName