2009-07-09 8 views
6

Entity FrameworkのクエリのXml

SELECT * 
FROM TreeNodes 
WHERE data.value('(/edumatic/assessmentItem/@type)[1]', 'nvarchar(max)') like 'multiplechoice1' 

データ列がXMLです。どうやらこれは

... Entity Frameworkのことで文字列に変換されるこれが私のスタートですが、ここから、私はどこを追加する方法を知っているだろう...

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(...) 

答えて

10

エンティティフレームワークのクエリ言語(LINQ to EntitiesおよびeSQL)は、ネストされたXMLクエリを直接サポートしません。だから、あなたはこの種のことをすることができないでしょう。 AsEnumerable()への呼び出し後にXMLクエリを実行しない限り、パフォーマンスの観点からはやや望ましくありません。

あなたはおそらく、このフィルタを実行するSSDLにストア関数を書くことができます。

XMLエディタでEDMXファイルを開き、StorageModelセクション(つまりSSDL)の下に要素を追加してみます。そのストア関数の<CommandText>(私はそれが呼ばれていると思います)は、適切なT-SQLを書くことができる場所であり、関数のパラメータも参照できます。申し訳ありませんが、この便利な例はありません。

はあなたがESQL IEでこのような何かストア機能を呼び出すことができることを行ってた:あなたはまた、あなたがその関数を呼び出すことができますので、.NETでのスタブ関数を記述することができるようになります.NET 4.0では

SELECT VALUE treeNode FROM TreeNodes as treeNode WHERE 
StorageModelNamespace.MyXmlWrapperFunctionForNVarchar('(/edumatic/assessmentItem/@type)[1]', treeNode.Data) LIKE 'multiplechoice1' 

をあまりにもLINQで:

[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のチーム

+0

あなたは(...ストア機能の例を挙げて)Entity Frameworkのを学ぶための本をお勧めしますか?どうも。 –

+0

かなり関連性の高いブログエントリ(Alexが実際に書いたもの):http://blogs.msdn.com/alexj/archive/2009/08/07/tip-30-how-to-use-a-custom-store -function.aspx – GordonB

+0

@Alex、私は同様の要件があり、あなたの提案に従っていますが、LINQ Where条件でEdmFunctionsを呼び出す際に問題があります。あなたは投稿を確認してください。http://stackoverflow.com/questions/24218403/query-xml-from-sql-using-entity-framework-database-first – Prasad

2

つの選択肢:

  1. は、すべてのデータを返すPROCを書きますエンティティタイプにマップしてそこにSQLを配置する必要があります。このメソッドは、DBサーバー上のXMLインデックスを使用できます。
  2. クライアントのデータを取得してから、XMLドキュメントを作成し、LINQ to XMLを使用します。プログラマにとっては便利ですが、XMLインデックスは使用できません。

LINQ to Entitiesは、DBサーバーのXML機能については認識していません。

関連する問題