2017-04-20 9 views
1

내가 같은 System.Linq.Dynamic를 사용하여 동적 SQL 쿼리를 생성 할 필요가 WHERE 내부 SELECT :System.Linq.Dynamic 사용은 문

SELECT 
    [Extent1].[FromRevision] AS [FromRevision], 
    [Extent1].[Field1] AS [Field1], 
    [Extent1].[TillRevision] AS [TillRevision], 
    [Extent1].[Field2] AS [Field2], 
    [Extent1].[Date1] AS [Date1], 
    [Extent1].[LastChangeDate] AS [LastChangeDate], 
    [Extent1].[Field3] AS [Field3] 
    FROM [log].[MyTable] AS [Extent1] 
    WHERE (([Extent1].[FromRevision] <= @p__linq__0) AND ([Extent1].[TillRevision] > @p__linq__1) AND 
    (NOT EXISTS (SELECT 
     1 AS [C1] 
     FROM [log].[MyTable] AS [Extent2] 
     WHERE ([Extent2].[Field1] = [Extent1].[Field1]) AND ([Extent2].[FromRevision] <= @p__linq__2) AND ([Extent2].[TillRevision] > @p__linq__3) 
    ))) 

이상과 같이, 일반적인 된 IQueryable에 대한 Linq에 의해 생성 된 코드 :

동적 인 Linq를 사용하여 동일한 결과를 얻을 수 있습니까? 일반 IQueryable을 사용하지 마십시오.

+0

당신이 표현 자신을 구축 동적 Linq에를 사용하지 않도록해야 할 이유가 있습니까 : 여기

는 동적으로 설치하는 방법을 바랍니다, 쿼리의 동적 LINQ 상응하는 무엇입니까? – NetMage

+0

네, 저는이 생성자, 필터 등에 어떤 타입이 올지 알고 있습니다. –

답변

2

params object[] values 옵션 인수를 사용하여 동적 쿼리에 일부 매개 변수 (예 : query, tillRevisionfromRevision)를 전달할 수 있습니다. 그런 다음 문자열 내에서 @0, @1, @2과 같은 위치를 참조 할 수 있습니다.

범위의 현재 범위 변수에 액세스하려면 it 또는 아무 것도 사용할 수 없습니다. 귀하의 o 변수와 동일합니다. 중요한 세부 사항은 중첩 된 범위 (예 : Any)를 입력 할 때 해당 범위 it 안에 있거나 o1 변수가 참조하는 것이 아무것도 없음을 의미합니다. 외부 변수에 액세스하려면 outerIt을 사용해야합니다.

var result = query.Where(
    "FromRevision <= @0 && TillRevision > @0 && [email protected](Uid == outerIt.Uid && FromRevision <= @1 && TillRevision > @1)", 
    tillRevision, // @0 
    fromRevision, // @1, 
    query // @2 
); 
+0

아쉽게도 예외가 발생합니다. "속성 또는 필드 'outerIt'이 'MyType'유형에 존재합니다."파서가 내 쿼리 매개 변수를 실제 개체 컬렉션으로 변환하고 "outerIt"이 무엇인지 모르는 것 같습니다. 어떤 아이디어? outerIt 문과 관련된 몇 가지 문제점이 있음을 발견했지만, 이제는 내 사례라고 확신합니다. –

+1

잘 모르겠습니다. 이전 버전 일 수 있습니까? Microsoft에서 System.Linq.Dynamic으로 테스트했습니다. v1.0.6 –

+2

outerIt은 일부 버전에서 구현 한 원래 동적 라이브러리의 확장이며, Nuget 버전 1.07에 포함되어 있어야합니다. 아직 보일 수도 있지만 그 구현의 버그. – NetMage