Domanda

Come si costruire questa query con Entity Framework:

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

colonna di dati è XML. A quanto pare questo viene convertito in una stringa da Entity Framework ...

Questa è la mia partenza, ma da qui non saprei come aggiungere il cui ...

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

Ho anche provato qualcosa di simile seguente codice, ma che non ha funzionato neanche:

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(...)
È stato utile?

Soluzione

Nessuno dei linguaggi di query di Entity Framework (LINQ to Entities e ESQL) sostenere direttamente query XML nidificate. Quindi non si ha intenzione di essere in grado di fare questo genere di cose. A meno che non si esegue la query XML dopo una chiamata a AsEnumerable(), che ovviamente è un po 'indesiderabile dal punto di vista delle prestazioni.

Detto questo si può probabilmente scrivere una funzione Store nella SSDL che fa questo filtro per voi.

Aprire il file EDMX in un editor XML, e provare ad aggiungere un elemento nella sezione StorageModel (vale a dire la SSDL). Il <CommandText> (penso che è quello che si chiama), di tale funzione Store è dove si può scrivere il T-SQL appropriata e si può fare riferimento ai parametri della funzione di troppo. Mi dispiace non ho un esempio di questa pratica.

Dopo aver fatto questo si può chiamare la funzione di memorizzazione in ESQL vale a dire qualcosa di simile:

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

In .NET 4.0 sarà anche in grado di scrivere una funzione stub in .NET in modo da poter chiamare tale funzione in LINQ troppo:

vale a dire.

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

, allora qualcosa di simile a questo:

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

Si prega di notare tutto il codice sopra è solo pseudo-codice Non ho effettivamente provato, sto solo cercando di aiutarti a iniziare.

Spero che questo aiuti

Alex

Program Manager Entity Framework Team

Altri suggerimenti

Due scelte:

  1. Scrivi una proc che restituisce tutti i dati necessari per il mapping a un tipo di entità, e mettere il vostro SQL lì. Questo metodo può utilizzare un indice XML sul server DB.
  2. Recupera i dati sul client, quindi costruire un documento XML e usare LINQ to XML. Conveniente per il programmatore, ma non può usare un indice XML.

LINQ to Entities non sa circa le caratteristiche DB XML server.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top