문제
엔티티 프레임 워크를 사용 하여이 쿼리를 어떻게 구축 하시겠습니까?
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;
위의 모든 코드는 단지 의사 코드 일뿐입니다. 실제로 테스트하지 않았습니다. 시작하는 데 도움을 주려고 노력하고 있습니다.
도움이 되었기를 바랍니다
알렉스
프로그램 관리자 엔티티 프레임 워크 팀
다른 팁
두 가지 선택 :
- 엔티티 유형에 매핑하는 데 필요한 모든 데이터를 반환하고 SQL을 넣는 Proc를 작성하십시오. 이 메소드는 DB 서버에서 XML 인덱스를 사용할 수 있습니다.
- 클라이언트의 데이터를 검색 한 다음 XML 문서를 작성하고 LINQ에서 XML을 사용하십시오. 프로그래머에게는 편리하지만 XML 인덱스를 사용할 수는 없습니다.
LINQ에서 엔티티는 DB 서버 XML 기능에 대해 알지 못합니다.