En mi código que tienen el siguiente fragmento de una consulta L2E:EF 4 produce constantes de cadena UNICODE en SQL donde el tipo de columna es varchar. ¿Como evitar?
where ol.ordhead.ohcustno == login && (ol.ollastdoctype == "IN") && ol.olstatus == "9"
Esto se traduce en SQL siguiente fragmento:
WHERE ([Extent8].[ohcustno] = @p__linq__1) AND (''IN'' = [Extent7].[ollastdoctype]) AND (''9'' = [Extent7].[olstatus]) ...
En cierta entrada de la consulta se ejecuta 3 segundos. Cómo cambio la consulta de esta manera:
where ol.ordhead.ohcustno == login && (ol.ollastdoctype == "IN" || ol.ollastdoctype == "CR") && ol.olstatus == "9"
y los cambios de 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 extraña razón Entity Framework decidió convertir mi IN y CR a 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 obtener ventaja de un índice porque los tipos comparados ahora son diferentes (varchar vs nvarchar)
¿Alguien puede explicarme por qué Entity Framework decide de repente convertir mis constantes en unicode? y como puedo evitarlo?
Se puede comprobar el modelo de almacenamiento y ver si su columna refleja correctamente varchar tipo nvarchar en lugar de –
@Akash Kava: Esta fue la primera cosa que hice.También tenga en cuenta que no cambié el modelo de almacenamiento, sin embargo, en la primera consulta, EF produce una constante no unicode, y en la segunda consulta, constantes unicode. –