| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Linq.Expressions;
- using System.Linq;
- using System.Reflection;
- using System.Diagnostics;
- using System.Runtime.CompilerServices;
- namespace System.Data.Linq {
- using System.Data.Linq.Mapping;
- using System.Data.Linq.Provider;
- internal sealed class DataQuery<T> : IOrderedQueryable<T>, IQueryProvider, IEnumerable<T>, IOrderedQueryable, IEnumerable, IListSource {
- DataContext context;
- Expression queryExpression;
- private IBindingList cachedList;
- public DataQuery(DataContext context, Expression expression) {
- this.context = context;
- this.queryExpression = expression;
- }
- Expression IQueryable.Expression {
- get { return this.queryExpression; }
- }
- Type IQueryable.ElementType {
- get { return typeof(T); }
- }
- [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
- IQueryable IQueryProvider.CreateQuery(Expression expression) {
- if (expression == null)
- throw Error.ArgumentNull("expression");
- Type eType = System.Data.Linq.SqlClient.TypeSystem.GetElementType(expression.Type);
- Type qType = typeof(IQueryable<>).MakeGenericType(eType);
- if (!qType.IsAssignableFrom(expression.Type))
- throw Error.ExpectedQueryableArgument("expression", qType);
- Type dqType = typeof(DataQuery<>).MakeGenericType(eType);
- return (IQueryable)Activator.CreateInstance(dqType, 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;
- }
- IQueryProvider IQueryable.Provider {
- get{
- return (IQueryProvider)this;
- }
- }
- 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();
- }
- bool IListSource.ContainsListCollection {
- get { return false; }
- }
- IList IListSource.GetList() {
- if (cachedList == null) {
- cachedList = GetNewBindingList();
- }
- return cachedList;
- }
- internal IBindingList GetNewBindingList() {
- return BindingList.Create<T>(this.context, this);
- }
- public override string ToString() {
- return this.context.Provider.GetQueryText(this.queryExpression);
- }
- }
- }
|