2011-08-26 9 views
0

내 질문은/자신의 IQueryable 구현을 할 때 Where() 확장자 IQueryable 메서드를 오버로드하는 것이 의미가 있습니까?IQueryable을 사용하여 확장 .Where 확장. <T> 구현

예를 들어 Entity Framework에서 ObjectSet에 대한 Where() 호출이 데이터베이스로 전달되는 실제 SQL을 변경한다는 것을 이해했습니다. 또는 IEnumerable()로 먼저 캐스팅하면 필터링은 LINQ-To-Entities 대신 LINQ-To-Objects를 사용하여 수행됩니다. 예를 들어

:

new MyDBEntities().MyDbTable.Where(x => x.SomeProperty == "SomeValue"); 
    // this is linq-to-entities and changes the database-level SQL 

대 :

new MyDBEntities().MyDbTable.AsEnumerable().Where(x => x.SomeProperty == "SomeValue"); 
    // this is linq-to-objects and filters the IEnumerable 

당신이 당신의 자신에 IQueryable과 된 IQueryable 이미 사전에 정의되어 확장 메서드를 구현할 때와 같은 경우로()이 처리 방법은? 특히 네이티브 SQL과 SqlDataReader를 사용하는 매우 간단한 ORM을 만들고 데이터베이스에 전달하기 전에 네이티브 SQL을 변경하는 .Where() 메서드를 갖고 싶습니다.

IQueryable을 사용하거나 완전히 자신 만의 클래스를 만들어야합니까? 람다 구문을 사용하고 필터링에 사용되는 람다 함수를 기반으로 SQL 명령을 변경하려고합니다.

+0

이것이 도움이 될지 모르겠지만 적어도 relinq에서 읽을 수는 있습니다. http://relinq.codeplex.com/ 그들은 이미 찾고있는 것 중 일부를 할 수도 있습니다 (열려 있습니다 출처). 또는 전혀 겹침이 없을 수도 있습니다. –

답변

1

IQueryable<T>과 유사한 유형을 만들 수 있지만 그다지 좋은 생각은 아닙니다. 인터페이스의 독자적인 구현을 작성해야합니다. There is a nice series of articles on how to do it이 준비되어 있지만 그렇게하는 것이 쉬운 작업이 아닙니다.

+0

사용자가 직접 구현 한 IQueryable 을 롤인하고 해당 표현 방문자가 모두 작업하는 경우 사용자 정의 .Where() 확장 메소드가 자동으로 생성되는지 또는 새로운 .where() 확장 메소드를 작성해야하는지 IQueryable 즉, public static MyQueryableImpl 에서 파생됩니다 (this MyQueryableImpl , Func 필터). –

+0

이렇게하면 'Queryable.Where()'메소드가 필요한 것을 수행합니다. 그것이 바로 그 때문입니다. 따라서 Where()를 직접 구현할 필요는 없지만 SQL을 수정하기 위해'Where() '를 호출하는 표현식을 번역 한 코드를 작성해야합니다. – svick

관련 문제