2010年9月15日水曜日

Linq To XmlでXNamespaceを指定する

前回SqlMetalの使い方を説明したが、今回は前回出力したマッピングファイルの書き換えをLinq To XMLで行う方法を紹介する。

マッピングファイルを書き換える理由は次の通り。複数のDBをまたいだクエリをLinq To Sqlで行う場合、マッピングファイルのTable要素は下記のようにServerName、DBNameを含んだ記述にしなければならない。

dbo.users → ServerName.DBName.dbo.users

SQL Server 2008で複数のDBを単一クエリで扱うための設定は下記を参照してほしい。
Linked Serverの設定方法
sp_addlinkedserver (Transact-SQL)

で、Linq To Xmlを使用してのマッピングファイルの読み込みなのだが、下記のようにXNamespaceを指定しないと予期したようにTable要素は取得できない。

var doc = XDocument.Load(mappingFilePath);
XNamespace ns = "http://schemas.microsoft.com/linqtosql/mapping/2007";
var table = doc.Descendants(ns+"Table").Where(x => 条件).FirstOrDefault();
// 省略

Linq To Xmlに限らずXmlDocumentやXPathでもXmlファイルを操作する場合は、名前空間の指定のある要素にはそれぞれXNamespaceを明示的に指定しなければ予期したように動作しないので注意しよう。

0 件のコメント:

コメントを投稿