e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
94 lines
3.3 KiB
C#
94 lines
3.3 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|