2017-11-21 12 views
1

기존 T-SQL 쿼리를 C# Linq2Sql 쿼리로 변환하려고하지만 생성 된 T-SQL 쿼리가 너무 깊게 중첩 된 COALESCE 체인을 만듭니다. 동적 T-SQL을 호출하지 않고이 문제를 해결할 수있는 방법이 있습니까?LINQ 2 SQL 병합 제한 주위에 작업

create table MyTable(id int, a int, b int, c int, d int) 

지금이 C 번호 조회 :

SELECT [t0].[id] AS [id], COALESCE([t0].[a],COALESCE([t0].[b],COALESCE([t0].[c],[t0].[d]))) AS [val] 
FROM [Case] AS [t0] 

:이 다음 T-SQL 결과

from t in MyTable select new { id = id, val = t.a ?? t.b ?? t.c ?? t.d }; 

다음과 같은 라인을 따라 SQL 서버의 테이블을 고려 보시다시피, Linq2Sql은 병합 연산자를 악용합니다 (각 연산자를 내부 및 별도의 석탄으로 중첩하여 유지합니다). esce (...), 본질적으로 두 개의 매개 변수 만 사용하는 IsNull (...)처럼 처리합니다.

문제는 SQL Server에 그러한 병합을 중첩 (10 단계) 할 수있는 한계가 있으며 내 쿼리의 매개 변수가 훨씬 더 많다는 것입니다. 이것은 나의 쿼리가 다음 오류 런타임 충돌 의미 COALESCE (A, B, C, D, E, F, G :

SqlException: Case expressions may only be nested to level 10.

원래 T-SQL 질의는 단순히 같은 통상적 파라미터를 스택. ..)하지만 Linq2Sql을 강제로 수행하는 방법을 찾을 수 없습니다. 어떤 도움이나 조언을 부탁드립니다!

물론 실제 쿼리에는 많은 테이블과 조인이 필요하며 위의 의사 코드는 설명을위한 것입니다.

답변

1

이이

from t in MyTable select new { id = id, val = (t.a ?? t.b) ?? (t.c ?? t.d) }; 

COALESCE(COALESCE([t0].[a],[t0].[b]),COALESCE([t0].[c],[t0].[d])) 

그래서 1024 열까지 확장해야 생성 시도 할 수 있습니다. 그러나 나는 그것이 이상하다는 것을 인정한다 ...

+0

위대한, 지금은 해결책으로 작동! 쌍으로, 그리고 재귀 쌍으로 설정하면 한계를 넘지 않게됩니다. 처음에는 괄호로 약간 실험했지만 출력이 너무 어둡다 (한도를 넘어서서). 차이를 느끼지 못했다. 감사합니다! –