Pregunta

¿Cómo construir esta consulta con el marco de la entidad:

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

columna de datos es XML. Al parecer, esto se convierte en una cadena por el marco de la entidad ...

Esta es mi comienzo, pero de aquí no sabría cómo agregar el dónde ...

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

También hemos probado algo como el siguiente código, pero eso no funcionó bien:

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(...)
¿Fue útil?

Solución

Ninguno de los lenguajes de consulta de Entity Framework (LINQ a Entidades y eSQL) apoyar directamente a las consultas XML anidados. Por lo que no va a ser capaz de hacer este tipo de cosas. A menos que se ejecuta la consulta XML después de una llamada a AsEnumerable(), que por supuesto es algo indeseable desde una perspectiva de rendimiento.

Una vez dicho esto es probable que pueda escribir una función de almacenamiento en el SSDL que hace este filtro para usted.

Abra el archivo EDMX en un editor de XML, y trate de añadir un elemento en la sección StorageModel (es decir, el SSDL). El <CommandText> (creo que eso es lo que se llama) de esa función es tienda donde se puede escribir el T-SQL apropiado y se puede hacer referencia a los parámetros de la función también. Lo siento, no tengo un ejemplo de esta práctica.

Una vez hecho esto se le puede llamar la función de almacenamiento en eSQL decir algo como esto:

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

En .NET 4.0 también puede ser capaz de escribir una función ramal en .NET para que pueda llamar a esa función en LINQ también:

es decir.

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

entonces algo como esto:

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

Tenga en cuenta todo el código anterior es sólo pseudo-código que en realidad no lo he probado, sólo estoy tratando de ayudarle a empezar.

Espero que esto ayude

Alex

Administrador de Programas Entidad Equipo del marco

Otros consejos

Dos opciones:

  1. Escribir un proc que devuelve todos los datos necesarios para asignar a un tipo de entidad, y poner su SQL allí. Este método se puede usar un índice XML en el servidor de base de datos.
  2. Recuperar los datos en el cliente, a continuación, construir un documento XML y utilizar LINQ to XML. Conveniente para el programador, pero no puede utilizar un índice XML.

LINQ a Entidades no sabe nada de DB características XML del servidor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top