NHibernate 3.2 를 사용 하여 Repository (ORuM) (10) Linq Provider 실현
21058 단어 repository
LINQ 모드 에서 모든 데이터 원본 을 조회 할 수 있 도록 다양한 방식 으로 LINQ 를 확장 할 수 있 습 니 다.데이터 원본 은 데이터 구조, 웹 서비스, 파일 시스템 또는 데이터베이스 등 이 될 수 있다.LINQ 모드 는 클 라 이언 트 로 하여 금 LINQ 조 회 를 할 수 있 는 데이터 원본 을 쉽게 조회 할 수 있 게 한다. 왜냐하면 조회 의 문법 과 패턴 이 변경 되 지 않 았 기 때문이다.
다음 과 같은 방식 으로 LINQ 를 데이터 원본 으로 확장 할 수 있 습 니 다.
LINQ 조회 데이터 원본
Linq Provider
IQueryable < T > 를 실현 하 는 LINQ 제공 프로그램 간 의 복잡성 은 차이 가 클 수 있 습 니 다.
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&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/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Ubuntu 20.04'de Yerel Oracle Linux 8 Deposu OluşturmaGerekli paketleri indirmek için ubuntu 18.04 deposu /etc/apt/sources.list 'e eklenir ve apt update komutu çalıştırılır. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.