NHibernate 3.2 를 사용 하여 Repository (ORuM) (10) Linq Provider 실현

21058 단어 repository
LINQ 확장 성
LINQ 모드 에서 모든 데이터 원본 을 조회 할 수 있 도록 다양한 방식 으로 LINQ 를 확장 할 수 있 습 니 다.데이터 원본 은 데이터 구조, 웹 서비스, 파일 시스템 또는 데이터베이스 등 이 될 수 있다.LINQ 모드 는 클 라 이언 트 로 하여 금 LINQ 조 회 를 할 수 있 는 데이터 원본 을 쉽게 조회 할 수 있 게 한다. 왜냐하면 조회 의 문법 과 패턴 이 변경 되 지 않 았 기 때문이다.
다음 과 같은 방식 으로 LINQ 를 데이터 원본 으로 확장 할 수 있 습 니 다.
  • 특정한 유형 에서 IEnumerable < T > 인 터 페 이 스 를 실현 하여 LINQ to Objects 가 이 유형 을 조회 할 수 있 도록 합 니 다.
  • 특정한 유형 을 확장 할 수 있 는 표준 조회 연산 자 방법 (예 를 들 어 Where 와 Select) 을 만 들 고 사용자 정의 LINQ 가 이 유형 을 조회 할 수 있 도록 합 니 다.
  • IQueryable < T > 인터페이스의 데이터 원본 을 실현 하기 위해 공급 자 를 만 듭 니 다.이 인 터 페 이 스 를 제공 하 는 프로그램 은 표현 식 트 리 로 LINQ 조 회 를 받 습 니 다. 프로그램 은 사용자 정의 방식 (예 를 들 어 원 격 방식) 으로 조 회 를 수행 할 수 있 습 니 다. 
  • 데이터 원본 에 기 존 LINQ 기술 을 이용 한 공급 자 를 만 듭 니 다.이 공급 자 는 조 회 를 할 수 있 을 뿐만 아니 라 사용자 가 정의 하 는 형식 에 삽입, 업데이트, 삭제 작업 과 맵 도 할 수 있 습 니 다.

  • LINQ 조회 데이터 원본
  • 메모리 의 데이터.두 가지 방식 을 통 해 LINQ 가 메모리 의 데 이 터 를 조회 할 수 있 습 니 다.만약 데이터 의 형식 이 IEnumerable < T > 를 실현 한다 면, LINQ to Objects 를 사용 하여 데 이 터 를 조회 할 수 있 습 니 다.IEnumerable < T > 인 터 페 이 스 를 통 해 형식 매 거 진 을 사용 할 수 없다 면 이 유형 에서 LINQ 표준 조회 연산 자 방법 을 정의 하거나 확장 가능 한 LINQ 표준 조회 연산 자 방법 을 만 들 수 있 습 니 다.표준 조회 연산 자의 사용자 정의 구현 은 지연 실행 을 사용 하여 결 과 를 되 돌려 야 합 니 다.
  • 원 격 데이터.LINQ 가 원 격 데이터 원본 을 조회 할 수 있 도록 하 는 가장 좋 은 옵션 은 IQueryable < T > 인 터 페 이 스 를 실현 하 는 것 입 니 다.그러나 이 는 데이터 원본 확장 을 위 한 프로그램 (예 를 들 어 LINQ to SQL) 과 는 다르다.Visual Studio 에 서 는 기 존 LINQ 기술 (예 를 들 어 LINQ to SQL) 을 다른 데이터 원본 형식 으로 확장 하 는 프로그램 모델 이 없습니다.

  • Linq Provider
    IQueryable < T > 를 실현 하 는 LINQ 제공 프로그램 간 의 복잡성 은 차이 가 클 수 있 습 니 다.
  • 복잡성 이 낮은 IQueryable 제공 프로그램 은 웹 서비스의 한 방법 과 상호작용 을 할 수 있다.이러한 유형의 제공 프로그램 은 처리 해 야 할 조회 에 구체 적 인 정보 가 있 기 때문에 매우 구체 적 이다.폐쇄 적 인 유형 시스템 이 있어 단일 결과 유형 을 공개 할 수 있다.대부분의 조 회 는 로 컬 에서 실 행 됩 니 다. 예 를 들 어 표준 조회 연산 자 를 사용 하 는 Enumerable 을 통 해 실 행 됩 니 다.복잡성 이 낮은 공급 자 는 조 회 를 나타 내 는 표현 식 트 리 의 한 방법 으로 표현 식 을 호출 하고 다른 곳 에서 조 회 를 처리 할 수 있 는 나머지 논 리 를 검사 할 수 있 습 니 다.
  • 중간 복잡성 의 IQueryable 제공 프로그램 은 일부 검색 언어 를 표현 할 수 있 는 데이터 원본 을 대상 으로 할 수 있 습 니 다.만약 에 이 프로그램 이 웹 서 비 스 를 대상 으로 한다 면 웹 서비스의 여러 가지 방법 과 상호작용 을 하고 조회 에 의 해 제 기 된 문 제 를 바탕 으로 호출 할 방법 을 선택 할 수 있 습 니 다.간단 한 제공 프로그램 에 비해 중간 복잡성 제공 프로그램의 유형 시스템 이 풍부 하지만 고정 유형 시스템 입 니 다.예 를 들 어 공급 자 는 다 중 관 계 를 가 진 유형 을 공개 할 수 있 지만 사용자 가 정의 하 는 유형 에 맵 기술 을 제공 하지 않 습 니 다.
  • 복잡 한 IQueryable 제공 프로그램 (예 를 들 어 LINQ to SQL 제공 프로그램) 은 완전한 LINQ 조 회 를 표현 가능 한 조회 언어 (예 를 들 어 SQL) 로 변환 할 수 있다.복잡성 이 낮은 제공 프로그램 에 비해 복잡 한 제공 프로그램 은 검색 에서 다양한 문 제 를 처리 할 수 있 기 때문에 더욱 전면적 이다.그것 은 또한 개방 적 인 유형 시스템 을 가지 고 있 기 때문에 사용자 가 정의 한 유형 을 비 추 는 광범 위 한 기초 구 조 를 포함해 야 한다.복잡 한 공급 절 차 를 개발 하 는 데 는 많은 정력 이 필요 하 다.

  • Linq Provider 실현 방법
     IQueryable LINQ 제공 프로그램 에 필요 한 인터페이스 구현: IQueryable < T >, IOrdered Queryable < T > 와 IQuery Provider.
    System. Linq. IQueryable < T > 인터페이스
    using System;
    using System.Collections;
    using System.Collections.Generic;
    namespace System.Linq
    {
    public interface IQueryable<out T> : IEnumerable<T>, IQueryable, IEnumerable
    {
    }
    }

    System. Linq. IQueryable 인터페이스
    using System;
    using System.Collections;
    using System.Linq.Expressions;
    namespace System.Linq
    {
    public interface IQueryable : IEnumerable
    {
    Expression Expression
    {
    get;
    }
    Type ElementType
    {
    get;
    }
    IQueryProvider Provider
    {
    get;
    }
    }
    }

    System. Linq. IOrdered Queryable < T > 인터페이스
    using System;
    using System.Collections;
    using System.Collections.Generic;
    namespace System.Linq
    {
    public interface IOrderedQueryable<out T> : IQueryable<T>, IEnumerable<T>, IOrderedQueryable, IQueryable, IEnumerable
    {
    }
    }

    System. Linq. IOrdered Queryable 인터페이스
    using System;
    using System.Collections;
    namespace System.Linq
    {
    public interface IOrderedQueryable : IQueryable, IEnumerable
    {
    }
    }

    System. Linq. IQueryProvider 인터페이스
    using System;
    using System.Linq.Expressions;
    namespace System.Linq
    {
    public interface IQueryProvider
    {
    IQueryable CreateQuery(Expression expression);
    IQueryable<TElement> CreateQuery<TElement>(Expression expression);
    object Execute(Expression expression);
    TResult Execute<TResult>(Expression expression);
    }
    }

     
    Linq to Sql Provider
    LINQ to SQL 은. NET Framework 3.5 버 전의 구성 요소 로 관계 데 이 터 를 대상 으로 관리 할 때 기본 구 조 를 제공 합 니 다. 
    LINQ to SQL 에서 관계 데이터베이스 의 데이터 모델 은 개발 자가 사용 하 는 프로 그래 밍 언어 로 표시 하 는 대상 모델 에 투사 된다.응용 프로그램 이 실 행 될 때 LINQ to SQL 은 대상 모델 의 언어 통합 조 회 를 SQL 로 변환 한 다음 데이터베이스 에 보 내 실행 합 니 다.데이터베이스 가 결 과 를 되 돌 릴 때 LINQ to SQL 은 프로 그래 밍 언어 로 처리 할 수 있 는 대상 으로 변환 합 니 다.
    LINQ to SQL 은 Sql Server 데이터베이스 만 지원 합 니 다. Linq Provider 는 내부 클래스 System. Data. Linq. Data Query 를 통 해 이 루어 집 니 다.
    System.Data.Linq.DataQuery
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data.Linq.Provider;
    using System.Data.Linq.SqlClient;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Runtime;
    using System.Runtime.CompilerServices;
    namespace System.Data.Linq
    {
    internal sealed class DataQuery<T> : IOrderedQueryable<T>, IQueryable<T>, IQueryProvider, IEnumerable<T>, IOrderedQueryable, IQueryable, IEnumerable, IListSource
    {
    private DataContext context;
    private Expression queryExpression;
    private IBindingList cachedList;
    Expression IQueryable.Expression
    {
    get
    {
    return this.queryExpression;
    }
    }
    Type IQueryable.ElementType
    {
    get
    {
    return typeof(T);
    }
    }
    IQueryProvider IQueryable.Provider
    {
    get
    {
    return this;
    }
    }
    bool IListSource.ContainsListCollection
    {
    get
    {
    return false;
    }
    }
    [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
    public DataQuery(DataContext context, Expression expression)
    {
    this.context = context;
    this.queryExpression = expression;
    }
    [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
    IQueryable IQueryProvider.CreateQuery(Expression expression)
    {
    if (expression == null)
    {
    throw Error.ArgumentNull("expression");
    }
    Type elementType = TypeSystem.GetElementType(expression.Type);
    Type type = typeof(IQueryable<>).MakeGenericType(new Type[]
    {
    elementType
    });
    if (!type.IsAssignableFrom(expression.Type))
    {
    throw Error.ExpectedQueryableArgument("expression", type);
    }
    Type type2 = typeof(DataQuery<>).MakeGenericType(new Type[]
    {
    elementType
    });
    return (IQueryable)Activator.CreateInstance(type2, new object[]
    {
    this.context,
    expression
    });
    }
    IQueryable<S> IQueryProvider.CreateQuery<S>(Expression expression)
    {
    if (expression == null)
    {
    throw Error.ArgumentNull("expression");
    }
    if (!typeof(IQueryable<S>).IsAssignableFrom(expression.Type))
    {
    throw Error.ExpectedQueryableArgument("expression", typeof(IEnumerable<S>));
    }
    return new DataQuery<S>(this.context, expression);
    }
    object IQueryProvider.Execute(Expression expression)
    {
    return this.context.Provider.Execute(expression).ReturnValue;
    }
    S IQueryProvider.Execute<S>(Expression expression)
    {
    return (S)this.context.Provider.Execute(expression).ReturnValue;
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
    return ((IEnumerable)this.context.Provider.Execute(this.queryExpression).ReturnValue).GetEnumerator();
    }
    IEnumerator<T> IEnumerable<T>.GetEnumerator()
    {
    return ((IEnumerable<T>)this.context.Provider.Execute(this.queryExpression).ReturnValue).GetEnumerator();
    }
    IList IListSource.GetList()
    {
    if (this.cachedList == null)
    {
    this.cachedList = this.GetNewBindingList();
    }
    return this.cachedList;
    }
    internal IBindingList GetNewBindingList()
    {
    return BindingList.Create<T>(this.context, this);
    }
    public override string ToString()
    {
    return this.context.Provider.GetQueryText(this.queryExpression);
    }
    }
    }

    LINQ 공급 자 목록
    출처: http://blogs.msdn.com/b/charlie/archive/2008/02/28/link-to-everything-a-list-of-linq-providers.aspx
    LINQ to Amazon: http://weblogs.asp.net/fmarguerie/archive/2006/06/26/Introducing-Linq-to-Amazon.aspx LINQ to Active Directory: http://www.codeplex.com/LINQtoAD LINQ to Bindable Sources (SyncLINQ): http://paulstovell.net/blog/index.php/why-synclinq-should-matter-to-you/ LINQ over C# project: http://www.codeplex.com/LinqOverCSharp LINQ to CRM: http://www.codeplex.com/LinqtoCRM LINQ To Geo - Language Integrated Query for Geospatial Data: http://www.codeplex.com/LinqToGeo LINQ to Excel: http://www.codeplex.com/xlslinq LINQ to Expressions (MetaLinq): http://www.codeplex.com/metalinq LINQ Extender (Toolkit for building LINQ Providers): http://www.codeplex.com/LinqExtender LINQ to Flickr: http://www.codeplex.com/LINQFlickr LINQ to Google: http://www.codeplex.com/glinq ">LINQ to Indexes (LINQ and i40): http://www.codeplex.com/i4o/Release/ProjectReleases.aspx?ReleaseId=3519 LINQ to IQueryable (Matt Warren on Providers): http://blogs.msdn.com/mattwar/archive/2007/08/09/linq-building-an-iqueryable-provider-part-vi.aspx LINQ to JSON: http://james.newtonking.com/archive/2008/02/11/linq-to-json-beta.aspx LINQ to NHibernate: http://www.ayende.com/Blog/archive/2007/03/17/Implementing-Linq-for-NHibernate-A-How-To-Guide--Part.aspx LINQ to JavaScript: http://www.codeplex.com/JSLINQ LINQ to LDAP: http://community.bartdesmet.net/blogs/bart/archive/2007/04/05/the-iqueryable-tales-linq-to-ldap-part-0.aspx LINQ to LLBLGen Pro: http://weblogs.asp.net/fbouma/archive/2008/03/12/beta-of-linq-to-llblgen-pro-released.aspx LINQ to Lucene: http://www.codeplex.com/linqtolucene LINQ to Metaweb(freebase): http://www.codeplex.com/metawebToLinQ LINQ to MySQL, Oracle and PostgreSql (DbLinq): http://code2code.net/DB_Linq/ LINQ to NCover: http://blog.joefeser.com/post/Linq-To-NCover-Part-2.aspx LINQ to Opf3: http://www.liensberger.it/web/blog/?p=235 LINQ to Parallel (PLINQ): http://www.microsoft.com/downloads/details.aspx?FamilyID=e848dc1d-5be3-4941-8705-024bc7f180ba&amp;displaylang=en LINQ to RDF Files: http://blogs.msdn.com/hartmutm/archive/2006/07/24/677200.aspx LINQ to Sharepoint: http://www.codeplex.com/LINQtoSharePoint LINQ to SimpleDB: http://www.codeplex.com/LinqToSimpleDB LINQ to Streams: http://www.codeplex.com/Slinq/ LINQ to WebQueries: http://blogs.msdn.com/hartmutm/archive/2006/06/12/628382.aspx LINQ to WMI: http://bloggingabout.net/blogs/emile/archive/2005/12/12/10514.aspx LINQ to XtraGrid: http://cs.rthand.com/blogs/blog_with_righthand/archive/2008/02/23/LINQ-to-XtraGrid.aspx
     
    소스 코드 다운로드: http://mvcquick.codeplex.com/  
     

    좋은 웹페이지 즐겨찾기