2011-10-26 7 views
5

Przeprowadzamy migrację kodu do użycia Entity Framework i zapytanie, które próbuje sortować na polu Nullable i dostarcza domyślną wartość sortowania, wartość jest pusta przy użyciu Nullable.GetValueOrDefault(T) Funkcja.Zamówienie na Nullable <int> z wartością domyślną w Entity Framework

Jednak po wykonaniu zwraca następujący błąd:

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

Kwerenda wygląda następująco:

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

Od this answer I can see that there is a way to provide "translations" within your EDMX. Czy moglibyśmy napisać podobne tłumaczenie dla tej funkcji koalescencji?

UWAGA: Kiedy próbowałem, operator koalescencji ?? zamiast GetValueOrDefault w zapytaniu działa. Więc może to, co czyni tę pracę, można wykorzystać?

Odpowiedz

12

Wierzę, że znalazłeś odpowiedź. Kiedy używasz ??, EF generuje SQL używając CASE, aby wybrać swoją wartość sortowania, jeśli ma wartość null, a następnie sortuje ją.

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

wygeneruje następujący 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 

Tak na marginesie, polecam coraz LINQPad który pozwoli Ci pracować z modeli EF i przeglądać SQL generowany. Warto również wiedzieć o klasie EntityFunctions i klasie SqlFunctions, ponieważ zapewniają one dostęp do kilku przydatnych funkcji.

+0

Dzięki! Jednak po tym, jak znalazłem '' 'do pracy, miałem nadzieję, że nie będę musiał edytować moich istniejących zapytań (napisanych w kontekście LINQ To SQL), które już używają GetValueOrDefault(). – Reddog

Powiązane problemy