8 Stimmen

Entity Framework Abfrage Xml

Wie würden Sie diese Abfrage mit Entity Framework aufbauen:

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

Datenspalte ist XML. Offenbar wird dies durch das Entity Framework in eine Zeichenfolge umgewandelt...

Das ist mein Anfang, aber von hier aus wüsste ich nicht, wie ich das Wo hinzufügen könnte...

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);

Ich habe auch etwas wie den folgenden Code versucht, aber auch das hat nicht funktioniert:

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

10voto

Alex James Punkte 20783

Keine der Abfragesprachen des Entity Frameworks (LINQ to Entities und eSQL) unterstützt direkt verschachtelte XML-Abfragen. Sie werden also nicht in der Lage sein, diese Art von Dingen zu tun. Es sei denn, Sie führen die XML-Abfrage nach einem Aufruf von AsEnumerable() was natürlich aus Sicht der Leistung eher unerwünscht ist.

Allerdings können Sie wahrscheinlich eine Speicherfunktion in der SSDL schreiben, die diesen Filter für Sie übernimmt.

Öffnen Sie die EDMX-Datei in einem XML-Editor, und versuchen Sie, ein Element unter dem Abschnitt StorageModel (d. h. SSDL) hinzuzufügen. Die <CommandText> (ich glaube, so heißt sie) dieser Store Function können Sie das entsprechende T-SQL schreiben und auch auf Parameter der Funktion verweisen. Leider habe ich kein Beispiel dafür parat.

Danach können Sie die Speicherfunktion in eSQL aufrufen, z. B. so:

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

In .NET 4.0 werden Sie auch in der Lage sein, eine Stub-Funktion in .NET zu schreiben, so dass Sie diese Funktion auch in LINQ aufrufen können:

d.h.

[EdmFunction("StorageModelNamespace", "MyXmlWrapperFunctionForNVarchar"]
public static string MyXmlHelper(string path, string data)
{
   throw new NotImplementedException("You can only call this function in a LINQ query");
}

dann so etwas wie dies:

var query = from e in edumatic3Context.TreeNodes
            where MyXmlHelper("(/edumatic/assessmentItem/@type)[1]", e.Data)
                 .StartsWith("multiplechoice1")
            select e;

Bitte beachten Sie, dass der obige Code nur ein Pseudocode ist, den ich nicht wirklich getestet habe. Ich versuche nur, Ihnen den Einstieg zu erleichtern.

Ich hoffe, das hilft

Alex

Programm-Manager Entity Framework Team

2voto

Craig Stuntz Punkte 124703

Zwei Möglichkeiten:

  1. Schreiben Sie eine Proc, die alle Daten zurückgibt, die für die Zuordnung zu einem Entitätstyp erforderlich sind, und geben Sie dort Ihr SQL ein. Diese Methode kann einen XML-Index auf dem DB-Server verwenden.
  2. Rufen Sie die Daten auf dem Client ab, erstellen Sie dann ein XML-Dokument und verwenden Sie LINQ to XML. Bequem für den Programmierer, kann aber keinen XML-Index verwenden.

LINQ to Entities kennt die XML-Funktionen des DB-Servers nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X