Question

Comment voulez-vous construire cette requête avec Entity Framework:

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

colonne de données est XML. Apparemment, cela est converti en une chaîne par Entity Framework ...

Ceci est mon départ, mais d'ici je ne sais pas comment ajouter le où ...

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

J'ai aussi essayé quelque chose comme code suivant, mais cela ne fonctionne pas non plus:

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(...)
Était-ce utile?

La solution

Aucune des langues de requête de Entity Framework (LINQ to Entities et eSQL) appuient directement les requêtes XML imbriquées. Donc, vous n'allez pouvoir faire ce genre de chose. À moins que vous exécutez la requête XML après un appel à AsEnumerable(), ce qui bien sûr est un peu indésirable du point de vue de la performance.

Cela dit, vous pouvez probablement écrire une fonction de magasin dans le SSDL qui fait ce filtre pour vous.

Ouvrez le fichier EDMX dans un éditeur XML, et essayez d'ajouter un élément dans la section StorageModel (à savoir le SSDL). Le <CommandText> (je pense que c'est ce qu'il est appelé) de cette fonction de magasin est l'endroit où vous pouvez écrire le T-SQL et vous pouvez vous référer aux paramètres de la fonction trop appropriée. Désolé, je n'ai pas un exemple de cette pratique.

Après avoir fait que vous pouvez appeler la fonction de magasin dans eSQL dire quelque chose comme ceci:

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

Dans .NET 4.0, vous pourrez également écrire une fonction stub dans .NET de sorte que vous pouvez appeler cette fonction dans LINQ trop:

i.e..

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

alors quelque chose comme ceci:

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

S'il vous plaît noter tout le code ci-dessus est juste pseudo-code, je ne l'ai pas fait testé, je suis juste en train de vous aider à démarrer.

Hope this helps

Alex

L'équipe responsable du programme Entity Framework

Autres conseils

Deux choix:

  1. Ecrire un proc qui renvoie toutes les données nécessaires à la carte à un type d'entité, et de mettre votre SQL là-bas. Cette méthode peut utiliser un index XML sur le serveur DB.
  2. Récupérer les données sur le client, puis construire un doc XML et utiliser LINQ pour XML. Pratique pour le programmeur, mais ne peut pas utiliser un index XML.

LINQ to Entities ne sait pas sur les fonctionnalités XML du serveur DB.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top