2009-07-09 2 views
6

:엔티티 프레임 워크 쿼리 XML을

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

데이터 열은 XML이다. 분명히이 ... 엔터티 프레임 워크에 의해 문자열로 변환

이 내 시작하지만

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

Entity Framework의 쿼리 언어 (LINQ to Entities 및 eSQL) 중첩 된 XML 쿼리를 직접 지원하지 않습니다. 그래서 당신은 이런 종류의 일을 할 수 없을 것입니다. AsEnumerable()에 대한 호출 후에 XML 쿼리를 실행하지 않는 한, 물론 성능 관점에서 보면 다소 바람직하지 않습니다.

아마도이 필터를 사용하는 SSDL에 Store Function을 작성할 수 있습니다.

XML 편집기에서 EDMX 파일을 열고 StorageModel 섹션 (예 : SSDL) 아래에 요소를 추가해보십시오. 해당 Store 함수의 <CommandText> (나는 그것이 무엇이라고 불리는가)은 적절한 T-SQL을 작성할 수있는 곳이며 함수의 매개 변수도 참조 할 수 있습니다. 죄송합니다.이 예제는 유용하지 않습니다.

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

는 .NET 4.0 당신은 또한 당신이 함수를 호출 할 수 있도록 .NET에서 스텁 함수를 작성 할 수 있습니다 :

는 ESQL이 같은 즉, 뭔가를 저장 (Store) 함수를 호출 할 수있는 일 데 너무 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; 

위의 코드는 모두 의사 코드입니다. 실제로 테스트하지는 않았으므로 시작하는 데 도움이됩니다.

희망이 (... 스토어 기능의 예제)

+0

당신이 엔티티 프레임 워크를 배우고 책을 추천 할 수

알렉스

프로그램 관리자 엔티티 프레임 워크 팀에게 도움이? 고마워. –

+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 기능에 대해 알지 못합니다.