Entity Framework クエリ XML
-
12-09-2019 - |
質問
Entity Framework を使用してこのクエリをどのように構築しますか。
SELECT *
FROM TreeNodes
WHERE data.value('(/edumatic/assessmentItem/@type)[1]', 'nvarchar(max)') like 'multiplechoice1'
データ列は XML です。どうやらこれはEntity Frameworkによって文字列に変換されるようです...
これが私のスタートですが、ここから where を追加する方法がわかりません...
var query = from e in edumatic3Context.TreeNodes
where e.Data.???????
select e;
foreach (var treeNode in query)
Console.WriteLine("{0} {1} {2} {3}", treeNode.TreeNodeId, treeNode.Name, treeNode.Type, treeNode.DateChanged);
次のコードのようなことも試しましたが、それも機能しませんでした。
var sql = "SELECT VALUE treeNode FROM TreeNodes as treeNode WHERE data.value('(/edumatic/assessmentItem/@type)[1]', 'nvarchar(max)') like 'multiplechoice1'";
var query = edumatic3Context.CreateQuery<TreeNodes>(sql);
foreach(...)
解決
Entity Frameworkののクエリ言語(エンティティとESQLにLINQ)のどちらも直接ネストされたXMLクエリをサポート。ですから、この種のものを行うことができるようにするつもりはありません。あなたはもちろん、パフォーマンスの観点から、やや好ましくないAsEnumerable()
に呼び出し、後にXMLクエリを実行しない限ります。
あなたはおそらくあなたのために、このフィルタを行いSSDLに保管機能を書くことができることを言ってます。
EDMXは、XMLエディタでアップファイルを開き、そしてStorageModel部(即ちSSDL)の下に要素を追加してみてください。そのストア機能の<CommandText>
は(私はそれが呼ばれているものだと思う)あなたは適切なT-SQLを書くことができ、あなたはあまりにも関数のパラメータを参照することができる場所です。申し訳ありませんが、私は、この便利なの例を持っていません。
あなたはこのようなESQLつまり何かにストア機能を呼び出すことができることを行ってました
SELECT VALUE treeNode FROM TreeNodes as treeNode WHERE
StorageModelNamespace.MyXmlWrapperFunctionForNVarchar('(/edumatic/assessmentItem/@type)[1]', treeNode.Data) LIKE 'multiplechoice1'
.NET 4.0であなたもあなたもLINQでその関数を呼び出すことができるように.NETでのスタブ関数を記述することができるようになります。
すなわち。
[EdmFunction("StorageModelNamespace", "MyXmlWrapperFunctionForNVarchar"]
public static string MyXmlHelper(string path, string data)
{
throw new NotImplementedException("You can only call this function in a LINQ query");
}
このような何かます:
var query = from e in edumatic3Context.TreeNodes
where MyXmlHelper("(/edumatic/assessmentItem/@type)[1]", e.Data)
.StartsWith("multiplechoice1")
select e;
上記のすべてのコードを注意してください、私は実際にそれをテストしていないだけで擬似コードで、私はちょうどあなたが始めるのに役立つしようとしています。
ホープ、このことができます。
アレックス
プログラムマネージャEntity Frameworkのチーム
他のヒント
2 つの選択肢:
- エンティティ タイプにマップするために必要なすべてのデータを返すプロシージャを作成し、そこに SQL を配置します。この方法では、DB サーバー上の XML インデックスを使用できます。
- クライアント上でデータを取得し、XML ドキュメントを構築し、LINQ to XML を使用します。プログラマにとっては便利ですが、XML インデックスは使用できません。
LINQ to Entities は、DB サーバーの XML 機能については認識しません。