DataQuery.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Linq.Expressions;
  6. using System.Linq;
  7. using System.Reflection;
  8. using System.Diagnostics;
  9. using System.Runtime.CompilerServices;
  10. namespace System.Data.Linq {
  11. using System.Data.Linq.Mapping;
  12. using System.Data.Linq.Provider;
  13. internal sealed class DataQuery<T> : IOrderedQueryable<T>, IQueryProvider, IEnumerable<T>, IOrderedQueryable, IEnumerable, IListSource {
  14. DataContext context;
  15. Expression queryExpression;
  16. private IBindingList cachedList;
  17. public DataQuery(DataContext context, Expression expression) {
  18. this.context = context;
  19. this.queryExpression = expression;
  20. }
  21. Expression IQueryable.Expression {
  22. get { return this.queryExpression; }
  23. }
  24. Type IQueryable.ElementType {
  25. get { return typeof(T); }
  26. }
  27. [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
  28. IQueryable IQueryProvider.CreateQuery(Expression expression) {
  29. if (expression == null)
  30. throw Error.ArgumentNull("expression");
  31. Type eType = System.Data.Linq.SqlClient.TypeSystem.GetElementType(expression.Type);
  32. Type qType = typeof(IQueryable<>).MakeGenericType(eType);
  33. if (!qType.IsAssignableFrom(expression.Type))
  34. throw Error.ExpectedQueryableArgument("expression", qType);
  35. Type dqType = typeof(DataQuery<>).MakeGenericType(eType);
  36. return (IQueryable)Activator.CreateInstance(dqType, new object[] { this.context, expression });
  37. }
  38. IQueryable<S> IQueryProvider.CreateQuery<S>(Expression expression) {
  39. if (expression == null)
  40. throw Error.ArgumentNull("expression");
  41. if (!typeof(IQueryable<S>).IsAssignableFrom(expression.Type))
  42. throw Error.ExpectedQueryableArgument("expression", typeof(IEnumerable<S>));
  43. return new DataQuery<S>(this.context, expression);
  44. }
  45. object IQueryProvider.Execute(Expression expression) {
  46. return this.context.Provider.Execute(expression).ReturnValue;
  47. }
  48. S IQueryProvider.Execute<S>(Expression expression) {
  49. return (S)this.context.Provider.Execute(expression).ReturnValue;
  50. }
  51. IQueryProvider IQueryable.Provider {
  52. get{
  53. return (IQueryProvider)this;
  54. }
  55. }
  56. IEnumerator IEnumerable.GetEnumerator() {
  57. return ((IEnumerable)this.context.Provider.Execute(this.queryExpression).ReturnValue).GetEnumerator();
  58. }
  59. IEnumerator<T> IEnumerable<T>.GetEnumerator() {
  60. return ((IEnumerable<T>)this.context.Provider.Execute(this.queryExpression).ReturnValue).GetEnumerator();
  61. }
  62. bool IListSource.ContainsListCollection {
  63. get { return false; }
  64. }
  65. IList IListSource.GetList() {
  66. if (cachedList == null) {
  67. cachedList = GetNewBindingList();
  68. }
  69. return cachedList;
  70. }
  71. internal IBindingList GetNewBindingList() {
  72. return BindingList.Create<T>(this.context, this);
  73. }
  74. public override string ToString() {
  75. return this.context.Provider.GetQueryText(this.queryExpression);
  76. }
  77. }
  78. }