2011-10-26 8 views
5

Estamos migrando algunos códigos para usar Entity Framework y tenemos una consulta que está tratando de ordenar en un campo Nullable y proporciona un valor de clasificación predeterminado; el valor es nulo utilizando el Nullable.GetValueOrDefault(T) función.OrderBy en un Nullable <int> con un valor predeterminado en Entity Framework

Sin embargo, tras la ejecución devuelve el siguiente error:

LINQ to Entities does not recognize the method 'Int32 GetValueOrDefault(Int32)' method, and this method cannot be translated into a store expression.

La consulta se parece a:

int magicDefaultSortValue = 250; 
var query = context.MyTable.OrderBy(t => t.MyNullableSortColumn 
              .GetValueOrDefault(magicDefaultSortValue)); 

De this answer I can see that there is a way to provide "translations" within your EDMX. ¿Podríamos escribir una traducción similar para esta función coalescente?

NOTA: Cuando lo intenté, el operador de coalescencia ?? en lugar de GetValueOrDefault en la consulta funciona. Entonces, ¿podría funcionar lo que sea que haga ese trabajo?

Respuesta

12

Creo que usted encontró su respuesta. Cuando usa ??, EF genera SQL usando CASE para seleccionar su valor de ordenamiento si el valor es null, y luego ordena sobre eso.

MyTable.OrderBy (t => t.MyNullableSortColumn ?? magicDefaultSortValue).ToArray(); 

generará el siguiente código SQL:

-- Region Parameters 
DECLARE p__linq__0 Int = 250 
-- EndRegion 
SELECT 
[Project1].[MyColumn1] AS [MyColumn1], 
[Project1].[MyNullableSortColumn] AS [MyNullableSortColumn] 
FROM (SELECT 
    CASE WHEN ([Extent1].[MyNullableSortColumn] IS NULL) THEN @p__linq__0 ELSE [Extent1].[MyNullableSortColumn] END AS [C1], 
    [Extent1].[MyColumn1] AS [MyColumn1], 
    [Extent1].[MyNullableSortColumn] AS [MyNullableSortColumn] 
    FROM [dbo].[MyTable] AS [Extent1] 
) AS [Project1] 
ORDER BY [Project1].[C1] ASC 

Como acotación al margen, le recomiendo conseguir LINQPad que le permitirá trabajar con sus modelos de EF y ver el SQL que se genera. Además, es útil saber sobre la clase EntityFunctions y la clase SqlFunctions, ya que proporcionan acceso a varias funciones útiles.

+0

Gracias! Sin embargo, después de encontrar el '??' para trabajar, esperaba no tener que editar mis consultas existentes (escritas en un contexto LINQ To SQL) que ya estaban usando GetValueOrDefault(). – Reddog

Cuestiones relacionadas