variable usar una tipo longitud ejemplos dato como clases clase cadena asigna c# entity-framework tsql entity-framework-4

c# - usar - EF 4 produce constantes de cadena UNICODE en SQL, donde el tipo de columna es varchar. ¿Como evitar?



string c# ejemplos (4)

En mi código tengo el siguiente fragmento de una consulta L2E:

where ol.ordhead.ohcustno == login && (ol.ollastdoctype == "IN") && ol.olstatus == "9"

Esto se traduce en el siguiente fragmento de SQL:

WHERE ([Extent8].[ohcustno] = @p__linq__1) AND (''''IN'''' = [Extent7].[ollastdoctype]) AND (''''9'''' = [Extent7].[olstatus]) ...

En una entrada determinada, la consulta ejecuta 3 segundos. Cambio la consulta de esta manera:

where ol.ordhead.ohcustno == login && (ol.ollastdoctype == "IN" || ol.ollastdoctype == "CR") && ol.olstatus == "9"

y los cambios SQL resultantes son los siguientes:

WHERE ([Extent6].[ohcustno] = @p__linq__1) AND ([Extent5].[ollastdoctype] IN (N''''IN'''',N''''CR'''')) AND (''''9'''' = [Extent5].[olstatus]) ...

Tenga en cuenta que, por alguna razón extraña, Entity Framework decidió convertir mi IN y CR en unicode. El resultado es que la consulta ahora ejecuta 6 segundos en la misma entrada. Si elimino manualmente el prefijo N de la cláusula IN y vuelvo a ejecutar la consulta en SSMS, el tiempo de ejecución se remonta a 3 segundos. Esto es, por supuesto, porque SQL Server Query Optimizer no puede aprovechar un índice porque los tipos comparados ahora son diferentes (varchar vs nvarchar)

¿Alguien puede explicarme por qué Entity Framework de repente decide convertir mis constantes a Unicode y cómo puedo evitarlo?


Este problema se ha resuelto oficialmente en las últimas versiones de EF. Puede definir el tipo de columna usando DataAnnotations. ¡Espero que esto ayude a alguien!

Ver esta respuesta: Tipo de columna de anotaciones de datos EF


Esto fue un problema hasta el lanzamiento de ODP.net Beta 2 pero con el lanzamiento de Beta3 de ODP.net 4.112.2.50 este problema está resuelto.


La solución EntityFunction.AsNonUnicode en realidad es bastante limitada, solo funciona cuando el valor proporcionado es literal o una cadena:

System.NotSupportedException: el método ''System.String AsNonUnicode (System.String)'' solo se admite en LINQ to Entities cuando el argumento es una variable de cadena o literal.

Este es un problema grave en EF4.1 y también se ha documentado aquí: http://connect.microsoft.com/VisualStudio/feedback/details/650410/entity-framework-contains-still-defaulting-to-unicode-for -varchar-fields

Hasta que esto no se solucione en EF en sí mismo, no hay una solución alternativa para interceptar la consulta y reemplazar manualmente la sintaxis usando algo como EFTraceProvider .

Brutal.


puede probar este método EntityFunction.AsNonUnicode , como se muestra a continuación

where ol.ordhead.ohcustno == login && (ol.ollastdoctype == EntityFunctions.AsNonUnicode("IN") || ol.ollastdoctype == EntityFunctions.AsNonUnicode("CR")) && ol.olstatus == "9"

Esta es solo la última esperanza, el próximo es informar errores a Microsoft.