문제

엔티티 프레임 워크를 사용 하여이 쿼리를 어떻게 구축 하시겠습니까?

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(...)
도움이 되었습니까?

해결책

엔티티 프레임 워크의 쿼리 언어 (LINQ에서 엔티티 및 ESQL)는 중첩 된 XML 쿼리를 직접 지원하지 않습니다. 그래서 당신은 이런 종류의 일을 할 수 없을 것입니다. 호출 후 XML 쿼리를 실행하지 않는 한 AsEnumerable(), 물론 성능 관점에서 어느 정도는 바람직하지 않습니다.

이 필터를 수행하는 SSDL에 상점 기능을 작성할 수 있다고 말했습니다.

XML 편집기에서 EDMX 파일을 열고 StorageModel 섹션 (예 : SSDL) 아래에 요소를 추가하십시오. 그만큼 <CommandText> (나는 그것이 그것이 그것이 불리는 것이라고 생각합니다) 그 상점 함수의 경우 적절한 t-sql을 작성할 수 있으며 함수의 매개 변수도 참조 할 수 있습니다. 죄송합니다.이 편리한 예가 없습니다.

이를 수행 한 후에는 ESQL IE에서 상점 기능을 호출 할 수 있습니다.

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

.NET 4.0에서는 .NET에 스텁 함수를 작성할 수도 있으므로 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;

위의 모든 코드는 단지 의사 코드 일뿐입니다. 실제로 테스트하지 않았습니다. 시작하는 데 도움을 주려고 노력하고 있습니다.

도움이 되었기를 바랍니다

알렉스

프로그램 관리자 엔티티 프레임 워크 팀

다른 팁

두 가지 선택 :

  1. 엔티티 유형에 매핑하는 데 필요한 모든 데이터를 반환하고 SQL을 넣는 Proc를 작성하십시오. 이 메소드는 DB 서버에서 XML 인덱스를 사용할 수 있습니다.
  2. 클라이언트의 데이터를 검색 한 다음 XML 문서를 작성하고 LINQ에서 XML을 사용하십시오. 프로그래머에게는 편리하지만 XML 인덱스를 사용할 수는 없습니다.

LINQ에서 엔티티는 DB 서버 XML 기능에 대해 알지 못합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top