기존 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을 강제로 수행하는 방법을 찾을 수 없습니다. 어떤 도움이나 조언을 부탁드립니다!
물론 실제 쿼리에는 많은 테이블과 조인이 필요하며 위의 의사 코드는 설명을위한 것입니다.
위대한, 지금은 해결책으로 작동! 쌍으로, 그리고 재귀 쌍으로 설정하면 한계를 넘지 않게됩니다. 처음에는 괄호로 약간 실험했지만 출력이 너무 어둡다 (한도를 넘어서서). 차이를 느끼지 못했다. 감사합니다! –