Frage

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 dies zu einem String durch das Entity Framework umgewandelt wird ...

Das ist mein Anfang, aber von hier würde ich nicht wissen, wie die, wo man hinzufügen ...

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 versucht, auch so etwas wie Code folgt, aber das hat nicht funktioniert entweder:

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(...)
War es hilfreich?

Lösung

Weder die Abfragesprachen des Entity Framework (LINQ to Entities und eSQL) direkt verschachtelte XML-Abfragen unterstützen. So wirst du in der Lage sein nicht diese Art der Sache zu tun. Sofern Sie die XML-Abfrage, nachdem ein Gespräch führen zu AsEnumerable(), was natürlich etwas unerwünscht aus einer Leistungsperspektive.

Nachdem das nun gesagt, dass Sie wahrscheinlich eine Speicherfunktion im SSDL schreiben können, die diese Filter für Sie tun.

Öffnen Sie die EDMX in einem XML-Editor-Datei auf, und versuchen, ein Element unter dem StorageModel Abschnitt Zugabe (das heißt der SSDL). Die <CommandText> (ich glaube, das ist, was sie genannt wird) diese Speicherfunktion ist, wo Sie den entsprechenden T-SQL schreiben könnten und Sie Parameter der Funktion verweisen. Leider habe ich nicht ein Beispiel für diese praktisch.

Nachdem dies erledigt, dass Sie die Speicherfunktion in eSQL das heißt in etwa so nennen kann:

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

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

d.

[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 etwa so aus:

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

Bitte beachten Sie alle oben genannten Code ist nur Pseudo-Code, den ich habe nicht wirklich getestet, bin ich nur versucht, Ihnen den Einstieg zu erleichtern.

Hope, das hilft

Alex

Programm-Manager Entity Framework Team

Andere Tipps

Zwei Möglichkeiten:

  1. ein proc schreiben, die alle Daten zurückgibt erforderlich ist, um eine Einheit Typ zuordnen und setzen Sie Ihre SQL dort. Diese Methode kann einen XML-Index auf dem DB-Server verwenden.
  2. Rufen Sie die Daten auf dem Client, dann ein XML-Dokument erstellen und verwenden LINQ to XML. Praktisch für den Programmierer, kann aber nicht einen XML-Index verwenden.

LINQ to Entities weiß nicht, über DB-Server XML-Funktionen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top