2011-10-26 1 views
5

일부 코드를 Entity Framework를 사용하도록 마이그레이션하고 Nullable 필드를 정렬하려고하는 쿼리가 있고 기본 정렬 값을 제공하는 값은 null입니다. Nullable.GetValueOrDefault(T) 기능.OrderBy on Nullable <int>에 Entity Framework의 기본값으로

그러나, 실행시 다음과 같은 오류를 반환합니다 this answer I can see that there is a way to provide "translations" within your EDMX에서

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

:

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

쿼리처럼 보인다. 이 통합 함수에 대해 비슷한 번역을 쓸 수 있을까요?

참고 : 시도 할 때 ?? 쿼리가 GetValueOrDefault 대신 작동하는 병합 연산자가 작동합니다. 그럼 아마 그 일을하는 것은 무엇이든 활용 될 수 있을까요?

답변

12

답변을 찾았습니다. ??을 사용할 때 EFF는 값이 null이면 정렬 값을 선택하기 위해 CASE을 사용하여 SQL을 생성 한 다음이를 정렬합니다. 나는 당신이 당신의 EF 모델과 함께 작업 할 수와 SQL이 생성되는 것을 볼 것이다 LINQPad을 받고 추천 할 것입니다, 옆

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

가 AS :

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

는 다음과 같은 SQL을 생성합니다. 또한 EntityFunctions 클래스와 SqlFunctions 클래스에 대해 알아두면 유용한 여러 기능에 액세스 할 수 있으므로 도움이됩니다.

+0

고마워요! 그러나'?? '가 작동하는 것을 발견 한 후에 이미 GetValueOrDefault()를 사용하고 있던 기존 쿼리 (LINQ To SQL 컨텍스트에 대해 작성된)를 편집하지 않아도되기를 바랬습니다. – Reddog