0
|
1 using System;
|
|
2 using System.Collections;
|
|
3 using System.Collections.Generic;
|
|
4 using System.Diagnostics;
|
|
5 using System.Linq;
|
|
6 using System.Linq.Expressions;
|
|
7 using System.Reflection;
|
|
8
|
|
9 using JetBrains.Annotations;
|
|
10
|
|
11 namespace BLToolkit.Data.Linq
|
|
12 {
|
|
13 using Reflection;
|
|
14
|
|
15 public abstract class ExpressionQuery<T> : IOrderedQueryable<T>, IQueryProvider
|
|
16 {
|
|
17 #region Init
|
|
18
|
|
19 protected void Init(IDataContextInfo dataContextInfo, Expression expression)
|
|
20 {
|
|
21 #if SILVERLIGHT
|
|
22 if (dataContextInfo == null) throw new ArgumentNullException("dataContextInfo");
|
|
23
|
|
24 DataContextInfo = dataContextInfo;
|
|
25 #else
|
|
26 DataContextInfo = dataContextInfo ?? new DefaultDataContextInfo();
|
|
27 #endif
|
|
28 Expression = expression ?? Expression.Constant(this);
|
|
29 }
|
|
30
|
|
31 [NotNull] public Expression Expression { get; set; }
|
|
32 [NotNull] public IDataContextInfo DataContextInfo { get; set; }
|
|
33
|
|
34 internal Query<T> Info;
|
|
35 internal object[] Parameters;
|
|
36
|
|
37 #endregion
|
|
38
|
|
39 #region Public Members
|
|
40
|
|
41 [DebuggerBrowsable(DebuggerBrowsableState.Never)]
|
|
42 private string _sqlTextHolder;
|
|
43
|
|
44 // ReSharper disable InconsistentNaming
|
|
45 [UsedImplicitly]
|
|
46 private string _sqlText { get { return SqlText; }}
|
|
47 // ReSharper restore InconsistentNaming
|
|
48
|
|
49 public string SqlText
|
|
50 {
|
|
51 get
|
|
52 {
|
|
53 if (_sqlTextHolder == null)
|
|
54 {
|
|
55 var info = GetQuery(Expression, true);
|
|
56 _sqlTextHolder = info.GetSqlText(DataContextInfo.DataContext, Expression, Parameters, 0);
|
|
57 }
|
|
58
|
|
59 return _sqlTextHolder;
|
|
60 }
|
|
61 }
|
|
62
|
|
63 #endregion
|
|
64
|
|
65 #region Execute
|
|
66
|
|
67 IEnumerable<T> Execute(IDataContextInfo dataContextInfo, Expression expression)
|
|
68 {
|
|
69 return GetQuery(expression, true).GetIEnumerable(null, dataContextInfo, expression, Parameters);
|
|
70 }
|
|
71
|
|
72 Query<T> GetQuery(Expression expression, bool cache)
|
|
73 {
|
|
74 if (cache && Info != null)
|
|
75 return Info;
|
|
76
|
|
77 var info = Query<T>.GetQuery(DataContextInfo, expression);
|
|
78
|
|
79 if (cache)
|
|
80 Info = info;
|
|
81
|
|
82 return info;
|
|
83 }
|
|
84
|
|
85 #endregion
|
|
86
|
|
87 #region IQueryable Members
|
|
88
|
|
89 Type IQueryable.ElementType
|
|
90 {
|
|
91 get { return typeof(T); }
|
|
92 }
|
|
93
|
|
94 Expression IQueryable.Expression
|
|
95 {
|
|
96 get { return Expression; }
|
|
97 }
|
|
98
|
|
99 IQueryProvider IQueryable.Provider
|
|
100 {
|
|
101 get { return this; }
|
|
102 }
|
|
103
|
|
104 #endregion
|
|
105
|
|
106 #region IQueryProvider Members
|
|
107
|
|
108 IQueryable<TElement> IQueryProvider.CreateQuery<TElement>(Expression expression)
|
|
109 {
|
|
110 if (expression == null)
|
|
111 throw new ArgumentNullException("expression");
|
|
112
|
|
113 return new ExpressionQueryImpl<TElement>(DataContextInfo, expression);
|
|
114 }
|
|
115
|
|
116 IQueryable IQueryProvider.CreateQuery(Expression expression)
|
|
117 {
|
|
118 if (expression == null)
|
|
119 throw new ArgumentNullException("expression");
|
|
120
|
|
121 var elementType = TypeHelper.GetElementType(expression.Type) ?? expression.Type;
|
|
122
|
|
123 try
|
|
124 {
|
|
125 return (IQueryable)Activator.CreateInstance(typeof(ExpressionQueryImpl<>).MakeGenericType(elementType), new object[] { DataContextInfo, expression });
|
|
126 }
|
|
127 catch (TargetInvocationException ex)
|
|
128 {
|
|
129 throw ex.InnerException;
|
|
130 }
|
|
131 }
|
|
132
|
|
133 TResult IQueryProvider.Execute<TResult>(Expression expression)
|
|
134 {
|
|
135 return (TResult)GetQuery(expression, false).GetElement(null, DataContextInfo, expression, Parameters);
|
|
136 }
|
|
137
|
|
138 object IQueryProvider.Execute(Expression expression)
|
|
139 {
|
|
140 return GetQuery(expression, false).GetElement(null, DataContextInfo, expression, Parameters);
|
|
141 }
|
|
142
|
|
143 #endregion
|
|
144
|
|
145 #region IEnumerable Members
|
|
146
|
|
147 IEnumerator<T> IEnumerable<T>.GetEnumerator()
|
|
148 {
|
|
149 return Execute(DataContextInfo, Expression).GetEnumerator();
|
|
150 }
|
|
151
|
|
152 IEnumerator IEnumerable.GetEnumerator()
|
|
153 {
|
|
154 return Execute(DataContextInfo, Expression).GetEnumerator();
|
|
155 }
|
|
156
|
|
157 #endregion
|
|
158 }
|
|
159 }
|