5

特にEntity Frameworkで使用するために、SQL Serverでxmlデータ列を使用する方法を理解するのに非常に苦労しています。

基本的に、私たちのテーブルの 1 つは、ユーザーが提供する「カスタム メタデータ」を XML 形式で格納するため、これをテーブルの Xml 列に格納するのが賢明であると思われました。

ただし、このアプリケーションの要件の 1 つは、メタデータの検索をサポートすることです。ユーザーは、XPath クエリ文字列と、XPath の値を比較する値を提供して、クエリに一致するメタデータを含む要素を検索できます。

SQL Server xml 関数がこれに最適であると特定しました (例: [xmlcol].exist('/path1/path2[0][text()=''valuetest'''] ) が、エンティティではサポートされていませんフレームワーク、苛立たしいことに (または具体的には、xml 列はサポートされていません) 別の方法として、ユーザー提供の XPath を xml 関数に渡す UDF を作成しようとしましたが、xml 関数は文字列リテラルしか許可しないことがわかったので、変数を提供できません...

この時点で、私はオプションを使い果たしていました。

IQueryable.ToString() の結果に対して正規表現置換を実行して XPath フィルターを挿入し、この文字列をデータベースに手動で送信する小さなコードを作成しましたが、これにも問題があります。たとえば、結果がナビゲーション プロパティを遅延ロードしていないように見えるためです。

私は探し続け、SQLCLR 型のアイデアに出くわし、XPath 比較を実行する SQLCLR 関数の作成を開始しました。同僚が Azure の SQL Server は SQLCLR をサポートしていないことを指摘するまで、私はこの時点で勝者だと思っていました。

他にどのようなオプションがありますか? 私は空に非常に近づいているようです...

4

2 に答える 2

2

これは、クエリを動的に作成するストアド プロシージャで行うことができます。

SQL フィドル

MS SQL Server 2008 スキーマのセットアップ:

create table YourTable
(
  ID int identity primary key,
  Name varchar(10) not null,
  XMLCol xml
);

go

insert into YourTable values
('Row 1', '<x>1</x>'),
('Row 2', '<x>2</x>'),
('Row 3', '<x>3</x>');

go

create procedure GetIt
  @XPath nvarchar(100)
as
begin
  declare @SQL nvarchar(max);

  set @SQL = N'
  select ID, Name
  from YourTable
  where XMLCol.exist('+quotename(@XPath, '''')+N') = 1';

  exec (@SQL);
end

クエリ 1 :

exec GetIt N'*[text() = "2"]'

結果

| ID |  NAME |
--------------
|  2 | Row 2 |
于 2013-02-11T12:48:47.987 に答える
0

「カスタマイズ可能」のままにするために、DbSet のSqlQuery メソッドを使用できます。

var query = @"SET ARITHABORT ON; 
              select * from [YourTable] where 
              [xmlcol].exist('/path1/path2[0][text()=''{0}''']";
var numOfResults = 5;
var offsetPage = 1;

var results = Context.YourTable.SqlQuery(String.Format(query,"valuetest"))
                              .OrderBy(x => x.col)
                              .Skip(offsetPage * numOfResults)
                              .Take(numOfResults).ToList();

その動的な性質のために、このメソッドは、ある程度の SQL インジェクション セキュリティ ホールも明らかにする可能性が高いことに注意してください。

于 2013-02-20T11:24:06.627 に答える