2012-11-21 2 views
2

나는 LinqKit를 사용하고 있습니다 (http://www.albahari.com/nutshell/linqkit.aspx)런타임에 LINQ 엔터티에서 쿼리 작성 '매개 변수가 범위에 없습니다.' LinqKit

구체적인 클래스를 정의 할 필요없이 다음과 같은 코드가 작동을하는 방법이 있나요?

LINQ to Entities를 사용하여 강력한 형식의 동적 쿼리를 작성하려고합니다.

나는 The parameter 'o' is not in scope. 오류가 발생합니다.

경우에 따라

void Main() 
{ 
    var lquery = from a in Foo select new { Bar = a.Baz }; // <-- error like this 
    //var lquery = from a in Foo select new stuff { Bar = a.Baz }; // <-- here no error 
    test("Case", lquery, o => o.Bar).Dump(); 
} 

class stuff { public string Bar {get; set;} } 

IQueryable<T> test<T>(string val, IQueryable<T> qry, Expression<Func<T, string>> selector){ 
    var ex = selector.Expand(); 
    var b = from c in qry.AsExpandable() 
      where ex.Invoke(c).Contains(val) 
      select c; 
    return b; 
} 

익명의 클래스가 test() 함께 사용할 때 구체적인 클래스 stuff가 다음 오류를 사용하지 않을 경우이 오류가 발생 나타납니다. 이 상황에서 익명 클래스를 사용할 수있는 해결 방법이 있습니까?

나는) (이 오류가 관련 LinkKit 될 수도 있지만 내가 거기에 다이빙하기에 충분한 기술적 지식이없는 ...

+0

if (m.Member.DeclaringType.Name.StartsWith ("<>")) return TransformExpr (m); 

을 relpaced? 또한, 내가 작성할 수없는 질문의 코드를 사용하면,'Main'에서'test'를 호출 할 때 타입 인자를 추론 할 수 없습니다. –

+0

이 코드는 ** LinqPad **와 함께 사용할 수 있습니다. **'Foo'는 테이블 이름으로 바꿀 수 있습니다.'Baz'는 상기 테이블의 열로 바꿀 수 있습니다. ** LinqPad **에서 코드를 실행 중입니다. LinqKit.dll 및 System.Linq.Expressions 및 LinqKit 네임 스페이스에 대한 참조가 필요합니다. – FooUser

+0

감사합니다. LinqPad에서 리필 할 수있었습니다. –

답변

1

LinqKit에서 내가 ExpressionExpander.VisitMemberAccess 익명 클래스에 대한 검사를 추가 실현 익명의 클래스를 작동시킬 수 있습니다.

는`Foo`가 정의하는 방법

string typeName = m.Member.DeclaringType.Name; 
bool isAnonymous = typeName.StartsWith("<>f__AnonymousType"), 
    isOuter = !isAnonymous && typeName.StartsWith("<>"); 
if (isOuter) 
    return TransformExpr (m);