2013-07-10 4 views
2

인앱보고 도구에 대한 백엔드로 동적 Linq를 사용하고 있으며 액세스해야하는 곳으로 갈 수없는 문제에 직면했습니다. 테이블은 1 : M 관계입니다.동적 Linq - 1 대 다수 관계가있는 테이블에 가입

내 단순화 된 데이터 구조는 이것이다 :이 문제없이 작동

from a in context.Table_A 
select new 
{ 
    a.RefNo, 
    val = from b in a.Table_B 
      where (b.A_ID == a.ID) 
      where (b.code == "A0001" 
      select(b.Value).FirstOrDefault() 
} 

:

Database schema

나는이 질의 한 경우 표준 Linq에에 내가 같이 쿼리를 쓸 것입니다. 그러나 동적 Linq를 사용하여 쿼리를 시도 할 때 조인을 사용할 수 없습니다.

아래 코드에서 내가 뭘보고 있는지 알 수 있지만 분명히 "a"를 사용할 수 없습니다. 및 "a.Table_B"쿼리에서 참조합니다. 이 컨텍스트에서 Table_B에 액세스하려면 무엇을해야합니까?

string select = "new (Ref_No, 
         val = from b in a.Table_B 
         where (b.A_ID == a.ID) 
         where (b.code == \"A0001\" 
         select(b.Value).FirstOrDefault()"; 

var results = context.Table_A.Select(select); 

편집 1 :

호건의 코멘트 @ 답변에 - 왜 조인을 사용하지 않습니다 보고서 시스템은 동적이며 선택 사항이 Table_B에 가입되지 않거나 (또는 실제로 Table_B에 여러 번 가입 함) 조인은 선택적이어야합니다. 내 다른이 문제는 Select 메서드와 달리 문자열을 매개 변수로 전달할 수 있기 때문에 Join() 메서드를 그렇게 쉽게 호출 할 수 없습니다. 내가 찾은 가장 가까운 것은 dynamic Linq join extention method입니다. 사용을 고려해야 할 수도 있지만 동적 선택()과 성가신 느낌이 들었습니다.

편집 2 :이 오류 제공

delegate string searchTableA(Table_A a); 

public void Search() 
{ 
    .... 

    searchTableA sel = (a) => 
    { 
     return (from b in context.Table_B 
     where (b.A_ID == a.ID) 
     select (b.Value)).FirstOrDefault(); 
    }; 

    var res = context.Table_A.Select(sel); 
} 

: :이 멀리있어 호건의 제안을 바탕으로

내가 돈 때문에 정확한 코드를 제공하는 'System.Data.Entity.DbSet<TestDynamicLinqJoins.Table_A>' does not contain a definition for 'Select' and the best extension method overload 'System.Linq.Dynamic.DynamicQueryable.Select(System.Linq.IQueryable, string, params object[])' has some invalid arguments

+0

왜 linq의 결합 기능을 사용하지 않습니까? – Hogan

+0

@Hogan - 편집을 참조하십시오. – GrandMasterFlush

+0

@GrandMasterFlush 귀하의 [질문] [1] [1]에 대한 해결책을 얻었습니까? http : //stackoverflow.com/questions/17567636/dynamic-linq-joining-a-table-with-1-to-many -relationship – sridharnetha

답변

0

하드 ' 요소의 유형을 알고 있지만 이처럼 무언가는 대리자를 사용하여 올바르게 작동합니다.

delegate string searchTableA(elementType a); 

searchTableA sel = (a) => 
    { 
    return from b in a.Table_B 
        where (b.A_ID == a.ID) 
        where (b.code == "A0001") 
        select(b.Value).FirstOrDefault(); 
    }; 

var results = context.Table_A.Select(sel); 
+0

@ GrandMasterFlush - 더 많은 코드를 볼 수 없으면 도움을 줄 수 없습니다. 당신은 아무것도 의미하지 않는 한 줄을 게시하고 있습니다. 질문과 함께 새로운 출처를 포함 시키거나 더 자세하게 새로운 질문을 만드십시오. – Hogan

+0

한 번 해 주셔서 감사합니다. 현재 코드로 질문을 업데이트했습니다. – GrandMasterFlush

+1

@GrandMasterFlush -'searchTableA (Table_A a)'가 테이블을 가지기를 원하지 않는다면, 당신은'Table_A' 엘리먼트를 취하기를 원할 것입니다. – Hogan