各列に拡張プロパティを持つ SQL テーブルがあります。
Linq2SQL を使用して c# で LINQ からこれらにアクセスする方法はありますか?
各列に拡張プロパティを持つ SQL テーブルがあります。
Linq2SQL を使用して c# で LINQ からこれらにアクセスする方法はありますか?
「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()
は苦痛ですが、2つのセレクターが必要になるよりも醜いものではありません。ただし、そのように書き直すことができます。
string desc = ctx.GetProperty(x => x.DataChanges, dc => dc.Change, "MS_Description");
ハッキーが少ないあなた次第です。所有者をから分割する必要があることにも注意してくださいtableName
。
それらにどのような方法でアクセスしますか? VS 2008 用の私の L2S アドインは、それらを xml ドキュメント コメント (VS インテリセンスに表示されるようにするため) と説明属性 [コードからアクセスできる] に変換できます。http://www.huagati.com/dbmltools/で「データベースからのドキュメントの更新」機能を参照してください...
DBにビューを作成して、sysビューから必要なすべての情報を選択できます-sys.extended_propertiesビュー(SQL2005以降)から始めて、必要に応じて他のビューに参加します(あなたの場合はsys.tablesとsys.all_columnsだと思います)。次に、そのビューをモデルの VS にインポートするだけです。
または、SMO を使用して、テーブル、列などの拡張プロパティを含むすべての SQL Server メタデータにアクセスすることもできます。それは LINQ to Objects になると思いますが。ちなみに、これは、この情報をクエリする唯一の (SQL Server のバージョン間で) 移植可能な方法です。