annotate Source/Data/Linq/Query.cs @ 1:8f65451dc28f

Исправлена проблема с фабрикой и выборкой нескольких объектов в linq выражении
author cin
date Fri, 28 Mar 2014 01:04:56 +0400
parents f990fcb411a9
children f757da6161a1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Collections;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.Linq.Expressions;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 namespace BLToolkit.Data.Linq
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 using BLToolkit.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 using Common;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 using Data.Sql;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 using Data.Sql.SqlProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 using Mapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 using Builder;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 using Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 public abstract class Query
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 #region Init
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 public abstract void Init(IBuildContext parseContext, List<ParameterAccessor> sqlParameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 #region Compare
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 public string ContextID;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 public Expression Expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 public MappingSchema MappingSchema;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 public bool Compare(string contextID, MappingSchema mappingSchema, Expression expr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 return
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 ContextID.Length == contextID.Length &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 ContextID == contextID &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 MappingSchema == mappingSchema &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 ExpressionHelper.Compare(Expression, expr, _queryableAccessorDic);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 readonly Dictionary<Expression,QueryableAccessor> _queryableAccessorDic = new Dictionary<Expression,QueryableAccessor>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 readonly List<QueryableAccessor> _queryableAccessorList = new List<QueryableAccessor>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 internal int AddQueryableAccessors(Expression expr, Expression<Func<Expression,IQueryable>> qe)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 QueryableAccessor e;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 if (_queryableAccessorDic.TryGetValue(expr, out e))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 return _queryableAccessorList.IndexOf(e);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 e = new QueryableAccessor { Accessor = qe.Compile() };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 e.Queryable = e.Accessor(expr);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 _queryableAccessorDic. Add(expr, e);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 _queryableAccessorList.Add(e);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 return _queryableAccessorList.Count - 1;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 public Expression GetIQueryable(int n, Expression expr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 return _queryableAccessorList[n].Accessor(expr).Expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 public class Query<T> : Query
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 public Query()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 GetIEnumerable = MakeEnumerable;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 public override void Init(IBuildContext parseContext, List<ParameterAccessor> sqlParameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 Queries.Add(new QueryInfo
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 SqlQuery = parseContext.SqlQuery,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 Parameters = sqlParameters,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 ContextID = parseContext.Builder.DataContextInfo.ContextID;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 MappingSchema = parseContext.Builder.MappingSchema;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 CreateSqlProvider = parseContext.Builder.DataContextInfo.CreateSqlProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 Expression = parseContext.Builder.OriginalExpression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 //Parameters = parameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 #region Properties & Fields
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 public Query<T> Next;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 public ParameterExpression[] CompiledParameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 public List<QueryInfo> Queries = new List<QueryInfo>(1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 public Func<ISqlProvider> CreateSqlProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 private ISqlProvider _sqlProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 public ISqlProvider SqlProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 get { return _sqlProvider ?? (_sqlProvider = CreateSqlProvider()); }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 public Func<QueryContext,IDataContextInfo,Expression,object[],object> GetElement;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 public Func<QueryContext,IDataContextInfo,Expression,object[],IEnumerable<T>> GetIEnumerable;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 IEnumerable<T> MakeEnumerable(QueryContext qc, IDataContextInfo dci, Expression expr, object[] ps)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 yield return ConvertTo<T>.From(GetElement(qc, dci, expr, ps));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 #region GetInfo
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 static Query<T> _first;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 static readonly object _sync = new object();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 const int CacheSize = 100;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 public static Query<T> GetQuery(IDataContextInfo dataContextInfo, Expression expr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 var query = FindQuery(dataContextInfo, expr);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 if (query == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 lock (_sync)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 query = FindQuery(dataContextInfo, expr);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 if (query == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 if (Configuration.Linq.GenerateExpressionTest)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 #if FW4 || SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 var testFile = new ExpressionTestGenerator().GenerateSource(expr);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 #else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 var testFile = "";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141 DbManager.WriteTraceLine(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 "Expression test code generated: '" + testFile + "'.",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 DbManager.TraceSwitch.DisplayName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149 query = new ExpressionBuilder(new Query<T>(), dataContextInfo, expr, null).Build<T>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 catch (Exception)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 if (!Configuration.Linq.GenerateExpressionTest)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 DbManager.WriteTraceLine(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 "To generate test code to diagnose the problem set 'BLToolkit.Common.Configuration.Linq.GenerateExpressionTest = true'.",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 DbManager.TraceSwitch.DisplayName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 throw;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 query.Next = _first;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 _first = query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 return query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 static Query<T> FindQuery(IDataContextInfo dataContextInfo, Expression expr)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 Query<T> prev = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177 var n = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 for (var query = _first; query != null; query = query.Next)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 if (query.Compare(dataContextInfo.ContextID, dataContextInfo.MappingSchema, expr))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 if (prev != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 lock (_sync)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 prev.Next = query.Next;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 query.Next = _first;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 _first = query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 return query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 if (n++ >= CacheSize)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 query.Next = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 prev = query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 #region NonQueryQuery
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 void FinalizeQuery()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214 foreach (var sql in Queries)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 sql.SqlQuery = SqlProvider.Finalize(sql.SqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 sql.Parameters = sql.Parameters
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 .Select (p => new { p, idx = sql.SqlQuery.Parameters.IndexOf(p.SqlParameter) })
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 .OrderBy(p => p.idx)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 .Select (p => p.p)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 .ToList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 public void SetNonQueryQuery()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 FinalizeQuery();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 if (Queries.Count != 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 SqlProvider.SqlQuery = Queries[0].SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 GetElement = (ctx,db,expr,ps) => NonQueryQuery(db, expr, ps);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 int NonQueryQuery(IDataContextInfo dataContextInfo, Expression expr, object[] parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 var dataContext = dataContextInfo.DataContext;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 object query = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 query = SetCommand(dataContext, expr, parameters, 0);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246 return dataContext.ExecuteNonQuery(query);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 finally
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 if (query != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 dataContext.ReleaseQuery(query);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 if (dataContextInfo.DisposeContext)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 dataContext.Dispose();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 public void SetNonQueryQuery2()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 FinalizeQuery();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 if (Queries.Count != 2)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 SqlProvider.SqlQuery = Queries[0].SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 GetElement = (ctx,db,expr,ps) => NonQueryQuery2(db, expr, ps);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 int NonQueryQuery2(IDataContextInfo dataContextInfo, Expression expr, object[] parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 var dataContext = dataContextInfo.DataContext;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 object query = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 query = SetCommand(dataContext, expr, parameters, 0);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 var n = dataContext.ExecuteNonQuery(query);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 if (n != 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 return n;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 query = SetCommand(dataContext, expr, parameters, 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 return dataContext.ExecuteNonQuery(query);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 finally
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 if (query != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 dataContext.ReleaseQuery(query);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 if (dataContextInfo.DisposeContext)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 dataContext.Dispose();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 #region ScalarQuery
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 public void SetScalarQuery<TS>()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 FinalizeQuery();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 if (Queries.Count != 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 SqlProvider.SqlQuery = Queries[0].SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 GetElement = (ctx,db,expr,ps) => ScalarQuery<TS>(db, expr, ps);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 TS ScalarQuery<TS>(IDataContextInfo dataContextInfo, Expression expr, object[] parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 var dataContext = dataContextInfo.DataContext;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 object query = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 query = SetCommand(dataContext, expr, parameters, 0);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 return (TS)dataContext.ExecuteScalar(query);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 finally
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 if (query != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328 dataContext.ReleaseQuery(query);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 if (dataContextInfo.DisposeContext)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 dataContext.Dispose();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 #region Query
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 int GetParameterIndex(ISqlExpression parameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 for (var i = 0; i < Queries[0].Parameters.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 var p = Queries[0].Parameters[i].SqlParameter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 if (p == parameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 return i;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 IEnumerable<IDataReader> RunQuery(IDataContextInfo dataContextInfo, Expression expr, object[] parameters, int queryNumber)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 var dataContext = dataContextInfo.DataContext;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 object query = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360 query = SetCommand(dataContext, expr, parameters, queryNumber);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 using (var dr = dataContext.ExecuteReader(query))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363 while (dr.Read())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 yield return dr;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 finally
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 if (query != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 dataContext.ReleaseQuery(query);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 if (dataContextInfo.DisposeContext)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372 dataContext.Dispose();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 object SetCommand(IDataContext dataContext, Expression expr, object[] parameters, int idx)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378 lock (this)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 SetParameters(expr, parameters, idx);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381 return dataContext.SetQuery(Queries[idx]);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385 void SetParameters(Expression expr, object[] parameters, int idx)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 foreach (var p in Queries[idx].Parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 var value = p.Accessor(expr, parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 if (value is IEnumerable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393 var type = value.GetType();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394 var etype = TypeHelper.GetElementType(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 if (etype == null || etype == typeof(object) ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397 etype.IsEnum ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 (TypeHelper.IsNullableType(etype) && etype.GetGenericArguments()[0].IsEnum))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400 var values = new List<object>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 foreach (var v in (IEnumerable)value)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404 values.Add(v);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 // Enum mapping done by parameter itself
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406 //values.Add(v != null && v.GetType().IsEnum ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407 // MappingSchema.MapEnumToValue(v, true) :
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408 // v);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 value = values;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415 p.SqlParameter.Value = value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 #region GetSqlText
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423 public string GetSqlText(IDataContext dataContext, Expression expr, object[] parameters, int idx)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425 var query = SetCommand(dataContext, expr, parameters, 0);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426 return dataContext.GetSqlText(query);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
431 #region Inner Types
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
432
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
433 internal delegate TElement Mapper<TElement>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
434 Query<T> query,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
435 QueryContext qc,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
436 IDataContext dc,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
437 IDataReader rd,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
438 MappingSchema ms,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
439 Expression expr,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
440 object[] ps);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
441
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
442 public class QueryInfo : IQueryContext
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
443 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
444 public QueryInfo()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
445 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
446 SqlQuery = new SqlQuery();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
447 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
448
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
449 public SqlQuery SqlQuery { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
450 public object Context { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
451
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
452 public SqlParameter[] GetParameters()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
453 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
454 var ps = new SqlParameter[Parameters.Count];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
455
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
456 for (var i = 0; i < ps.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
457 ps[i] = Parameters[i].SqlParameter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
458
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
459 return ps;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
460 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
461
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
462 public List<ParameterAccessor> Parameters = new List<ParameterAccessor>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
463 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
464
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
465 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
466
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
467 #region Object Operations
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
468
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
469 static class ObjectOperation<T1>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
470 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
471 public static readonly Dictionary<object,Query<int>> Insert = new Dictionary<object,Query<int>>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
472 public static readonly Dictionary<object,Query<object>> InsertWithIdentity = new Dictionary<object,Query<object>>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
473 public static readonly Dictionary<object,Query<int>> InsertOrUpdate = new Dictionary<object,Query<int>>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
474 public static readonly Dictionary<object,Query<int>> Update = new Dictionary<object,Query<int>>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
475 public static readonly Dictionary<object,Query<int>> Delete = new Dictionary<object,Query<int>>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
476 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
477
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
478 static object ConvertNullable<TT>(TT value, TT defaultValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
479 where TT : struct
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
480 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
481 return value.Equals(defaultValue) ? null : (object)value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
482 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
483
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
484 static ParameterAccessor GetParameter<TR>(IDataContext dataContext, SqlField field)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
485 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
486 var exprParam = Expression.Parameter(typeof(Expression), "expr");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
487
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
488 Expression getter = Expression.Convert(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
489 Expression.Property(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
490 Expression.Convert(exprParam, typeof(ConstantExpression)),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
491 ReflectionHelper.Constant.Value),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
492 typeof(T));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
493
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
494 var mm = field.MemberMapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
495 var members = mm.MemberName.Split('.');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
496 var defValue = Expression.Constant(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
497 mm.MapMemberInfo.DefaultValue ?? TypeHelper.GetDefaultValue(mm.MapMemberInfo.Type),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
498 mm.MapMemberInfo.Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
499
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
500 for (var i = 0; i < members.Length; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
501 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
502 var member = members[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
503 var pof = Expression.PropertyOrField(getter, member) as Expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
504
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
505 if (i == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
506 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
507 if (members.Length == 1 && mm.IsExplicit)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
508 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
509 if (getter.Type != typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
510 getter = Expression.Convert(getter, typeof(object));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
511
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
512 pof = Expression.Call(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
513 Expression.Constant(mm),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
514 ReflectionHelper.Expressor<MemberMapper>.MethodExpressor(m => m.GetValue(null)),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
515 getter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
516 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
517
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
518 getter = pof;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
519 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
520 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
521 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
522 getter = Expression.Condition(Expression.Equal(getter, Expression.Constant(null)), defValue, pof);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
523 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
524 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
525
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
526 if (!mm.Type.IsClass && !mm.Type.IsInterface && mm.MapMemberInfo.Nullable && !TypeHelper.IsNullableType(mm.Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
527 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
528 var method = ReflectionHelper.Expressor<int>.MethodExpressor(_ => ConvertNullable(0, 0))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
529 .GetGenericMethodDefinition()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
530 .MakeGenericMethod(mm.Type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
531
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
532 getter = Expression.Call(null, method, getter, Expression.Constant(mm.MapMemberInfo.NullValue));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
533 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
534 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
535 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
536 if (getter.Type != typeof(object))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
537 getter = Expression.Convert(getter, typeof(object));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
538 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
539
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
540 var mapper = Expression.Lambda<Func<Expression,object[],object>>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
541 getter,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
542 new [] { exprParam, Expression.Parameter(typeof(object[]), "ps") });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
543
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
544 var param = new ParameterAccessor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
545 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
546 Expression = null,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
547 Accessor = mapper.Compile(),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
548 SqlParameter = new SqlParameter(field.SystemType, field.Name.Replace('.', '_'), null, dataContext.MappingSchema)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
549 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
550
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
551 if (TypeHelper.IsEnumOrNullableEnum(field.SystemType))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
552 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
553 param.SqlParameter.SetEnumConverter(field.MemberMapper.ComplexMemberAccessor, dataContext.MappingSchema);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
554 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
555
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
556 return param;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
557 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
558
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
559 #region Insert
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
560
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
561 public static int Insert(IDataContextInfo dataContextInfo, T obj)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
562 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
563 if (Equals(default(T), obj))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
564 return 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
565
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
566 Query<int> ei;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
567
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
568 var key = new { dataContextInfo.MappingSchema, dataContextInfo.ContextID };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
569
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
570 if (!ObjectOperation<T>.Insert.TryGetValue(key, out ei))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
571 lock (_sync)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
572 if (!ObjectOperation<T>.Insert.TryGetValue(key, out ei))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
573 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
574 var sqlTable = new SqlTable<T>(dataContextInfo.MappingSchema);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
575 var sqlQuery = new SqlQuery { QueryType = QueryType.Insert };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
576
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
577 sqlQuery.Insert.Into = sqlTable;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
578
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
579 ei = new Query<int>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
580 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
581 MappingSchema = dataContextInfo.MappingSchema,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
582 ContextID = dataContextInfo.ContextID,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
583 CreateSqlProvider = dataContextInfo.CreateSqlProvider,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
584 Queries = { new Query<int>.QueryInfo { SqlQuery = sqlQuery, } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
585 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
586
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
587 foreach (var field in sqlTable.Fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
588 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
589 if (field.Value.IsInsertable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
590 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
591 var param = GetParameter<int>(dataContextInfo.DataContext, field.Value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
592
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
593 ei.Queries[0].Parameters.Add(param);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
594
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
595 sqlQuery.Insert.Items.Add(new SqlQuery.SetExpression(field.Value, param.SqlParameter));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
596 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
597 else if (field.Value.IsIdentity)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
598 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
599 var expr = ei.SqlProvider.GetIdentityExpression(sqlTable, field.Value, false);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
600
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
601 if (expr != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
602 sqlQuery.Insert.Items.Add(new SqlQuery.SetExpression(field.Value, expr));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
603 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
604 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
605
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
606 ei.SetNonQueryQuery();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
607
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
608 ObjectOperation<T>.Insert.Add(key, ei);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
609 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
610
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
611 return (int)ei.GetElement(null, dataContextInfo, Expression.Constant(obj), null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
612 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
613
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
614 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
615
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
616 #region InsertWithIdentity
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
617
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
618 public static object InsertWithIdentity(IDataContextInfo dataContextInfo, T obj)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
619 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
620 if (Equals(default(T), obj))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
621 return 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
622
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
623 Query<object> ei;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
624
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
625 var key = new { dataContextInfo.MappingSchema, dataContextInfo.ContextID };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
626
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
627 if (!ObjectOperation<T>.InsertWithIdentity.TryGetValue(key, out ei))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
628 lock (_sync)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
629 if (!ObjectOperation<T>.InsertWithIdentity.TryGetValue(key, out ei))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
630 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
631 var sqlTable = new SqlTable<T>(dataContextInfo.MappingSchema);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
632 var sqlQuery = new SqlQuery { QueryType = QueryType.Insert };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
633
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
634 sqlQuery.Insert.Into = sqlTable;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
635 sqlQuery.Insert.WithIdentity = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
636
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
637 ei = new Query<object>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
638 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
639 MappingSchema = dataContextInfo.MappingSchema,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
640 ContextID = dataContextInfo.ContextID,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
641 CreateSqlProvider = dataContextInfo.CreateSqlProvider,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
642 Queries = { new Query<object>.QueryInfo { SqlQuery = sqlQuery, } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
643 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
644
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
645 foreach (var field in sqlTable.Fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
646 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
647 if (field.Value.IsInsertable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
648 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
649 var param = GetParameter<object>(dataContextInfo.DataContext, field.Value);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
650
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
651 ei.Queries[0].Parameters.Add(param);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
652
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
653 sqlQuery.Insert.Items.Add(new SqlQuery.SetExpression(field.Value, param.SqlParameter));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
654 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
655 else if (field.Value.IsIdentity)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
656 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
657 var expr = ei.SqlProvider.GetIdentityExpression(sqlTable, field.Value, true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
658
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
659 if (expr != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
660 sqlQuery.Insert.Items.Add(new SqlQuery.SetExpression(field.Value, expr));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
661 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
662 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
663
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
664 ei.SetScalarQuery<object>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
665
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
666 ObjectOperation<T>.InsertWithIdentity.Add(key, ei);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
667 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
668
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
669 return ei.GetElement(null, dataContextInfo, Expression.Constant(obj), null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
670 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
671
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
672 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
673
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
674 #region InsertOrReplace
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
675
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
676 [Obsolete("Use 'InsertOrReplace' instead.")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
677 public static int InsertOrUpdate(IDataContextInfo dataContextInfo, T obj)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
678 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
679 return InsertOrReplace(dataContextInfo, obj);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
680 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
681
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
682 public static int InsertOrReplace(IDataContextInfo dataContextInfo, T obj)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
683 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
684 if (Equals(default(T), obj))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
685 return 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
686
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
687 Query<int> ei;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
688
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
689 var key = new { dataContextInfo.MappingSchema, dataContextInfo.ContextID };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
690
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
691 if (!ObjectOperation<T>.InsertOrUpdate.TryGetValue(key, out ei))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
692 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
693 lock (_sync)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
694 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
695 if (!ObjectOperation<T>.InsertOrUpdate.TryGetValue(key, out ei))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
696 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
697 var fieldDic = new Dictionary<SqlField, ParameterAccessor>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
698 var sqlTable = new SqlTable<T>(dataContextInfo.MappingSchema);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
699 var sqlQuery = new SqlQuery { QueryType = QueryType.InsertOrUpdate };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
700
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
701 ParameterAccessor param;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
702
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
703 sqlQuery.Insert.Into = sqlTable;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
704 sqlQuery.Update.Table = sqlTable;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
705
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
706 sqlQuery.From.Table(sqlTable);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
707
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
708 ei = new Query<int>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
709 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
710 MappingSchema = dataContextInfo.MappingSchema,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
711 ContextID = dataContextInfo.ContextID,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
712 CreateSqlProvider = dataContextInfo.CreateSqlProvider,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
713 Queries = { new Query<int>.QueryInfo { SqlQuery = sqlQuery, } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
714 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
715
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
716 var supported = ei.SqlProvider.IsInsertOrUpdateSupported && ei.SqlProvider.CanCombineParameters;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
717
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
718 // Insert.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
719 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
720 foreach (var field in sqlTable.Fields.Select(f => f.Value))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
721 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
722 if (field.IsInsertable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
723 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
724 if (!supported || !fieldDic.TryGetValue(field, out param))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
725 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
726 param = GetParameter<int>(dataContextInfo.DataContext, field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
727 ei.Queries[0].Parameters.Add(param);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
728
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
729 if (supported)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
730 fieldDic.Add(field, param);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
731 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
732
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
733 sqlQuery.Insert.Items.Add(new SqlQuery.SetExpression(field, param.SqlParameter));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
734 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
735 else if (field.IsIdentity)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
736 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
737 throw new LinqException("InsertOrUpdate method does not support identity field '{0}.{1}'.", sqlTable.Name, field.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
738 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
739 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
740
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
741 // Update.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
742 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
743 var keys = sqlTable.GetKeys(true).Cast<SqlField>().ToList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
744 var fields = sqlTable.Fields.Values.Where(f => f.IsUpdatable).Except(keys).ToList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
745
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
746 if (keys.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
747 throw new LinqException("InsertOrUpdate method requires the '{0}' table to have a primary key.", sqlTable.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
748
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
749 var q =
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
750 (
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
751 from k in keys
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
752 join i in sqlQuery.Insert.Items on k equals i.Column
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
753 select new { k, i }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
754 ).ToList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
755
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
756 var missedKey = keys.Except(q.Select(i => i.k)).FirstOrDefault();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
757
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
758 if (missedKey != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
759 throw new LinqException("InsertOrUpdate method requires the '{0}.{1}' field to be included in the insert setter.",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
760 sqlTable.Name,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
761 missedKey.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
762
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
763 if (fields.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
764 throw new LinqException(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
765 string.Format("There are no fields to update in the type '{0}'.", sqlTable.Name));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
766
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
767 foreach (var field in fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
768 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
769 if (!supported || !fieldDic.TryGetValue(field, out param))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
770 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
771 param = GetParameter<int>(dataContextInfo.DataContext, field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
772 ei.Queries[0].Parameters.Add(param);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
773
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
774 if (supported)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
775 fieldDic.Add(field, param = GetParameter<int>(dataContextInfo.DataContext, field));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
776 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
777
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
778 sqlQuery.Update.Items.Add(new SqlQuery.SetExpression(field, param.SqlParameter));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
779 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
780
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
781 sqlQuery.Update.Keys.AddRange(q.Select(i => i.i));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
782
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
783 // Set the query.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
784 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
785 if (ei.SqlProvider.IsInsertOrUpdateSupported)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
786 ei.SetNonQueryQuery();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
787 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
788 ei.MakeAlternativeInsertOrUpdate(sqlQuery);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
789
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
790 ObjectOperation<T>.InsertOrUpdate.Add(key, ei);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
791 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
792 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
793 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
794
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
795 return (int)ei.GetElement(null, dataContextInfo, Expression.Constant(obj), null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
796 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
797
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
798 internal void MakeAlternativeInsertOrUpdate(SqlQuery sqlQuery)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
799 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
800 var dic = new Dictionary<ICloneableElement,ICloneableElement>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
801
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
802 var insertQuery = (SqlQuery)sqlQuery.Clone(dic, _ => true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
803
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
804 insertQuery.QueryType = QueryType.Insert;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
805 insertQuery.ClearUpdate();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
806 insertQuery.From.Tables.Clear();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
807
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
808 Queries.Add(new QueryInfo
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
809 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
810 SqlQuery = insertQuery,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
811 Parameters = Queries[0].Parameters
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
812 .Select(p => new ParameterAccessor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
813 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
814 Expression = p.Expression,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
815 Accessor = p.Accessor,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
816 SqlParameter = dic.ContainsKey(p.SqlParameter) ? (SqlParameter)dic[p.SqlParameter] : null
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
817 })
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
818 .Where(p => p.SqlParameter != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
819 .ToList(),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
820 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
821
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
822 var keys = sqlQuery.Update.Keys;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
823
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
824 foreach (var key in keys)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
825 sqlQuery.Where.Expr(key.Column).Equal.Expr(key.Expression);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
826
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
827 sqlQuery.QueryType = QueryType.Update;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
828 sqlQuery.ClearInsert();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
829
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
830 SetNonQueryQuery2();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
831
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
832 Queries.Add(new QueryInfo
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
833 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
834 SqlQuery = insertQuery,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
835 Parameters = Queries[0].Parameters.ToList(),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
836 });
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
837 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
838
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
839 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
840
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
841 #region Update
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
842
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
843 public static int Update(IDataContextInfo dataContextInfo, T obj)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
844 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
845 if (Equals(default(T), obj))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
846 return 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
847
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
848 Query<int> ei;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
849
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
850 var key = new { dataContextInfo.MappingSchema, dataContextInfo.ContextID };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
851
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
852 if (!ObjectOperation<T>.Update.TryGetValue(key, out ei))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
853 lock (_sync)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
854 if (!ObjectOperation<T>.Update.TryGetValue(key, out ei))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
855 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
856 var sqlTable = new SqlTable<T>(dataContextInfo.MappingSchema);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
857 var sqlQuery = new SqlQuery { QueryType = QueryType.Update };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
858
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
859 sqlQuery.From.Table(sqlTable);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
860
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
861 ei = new Query<int>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
862 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
863 MappingSchema = dataContextInfo.MappingSchema,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
864 ContextID = dataContextInfo.ContextID,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
865 CreateSqlProvider = dataContextInfo.CreateSqlProvider,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
866 Queries = { new Query<int>.QueryInfo { SqlQuery = sqlQuery, } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
867 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
868
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
869 var keys = sqlTable.GetKeys(true).Cast<SqlField>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
870 var fields = sqlTable.Fields.Values.Where(f => f.IsUpdatable).Except(keys).ToList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
871
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
872 if (fields.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
873 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
874 if (Configuration.Linq.IgnoreEmptyUpdate)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
875 return 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
876
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
877 throw new LinqException(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
878 string.Format("There are no fields to update in the type '{0}'.", sqlTable.Name));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
879 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
880
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
881 foreach (var field in fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
882 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
883 var param = GetParameter<int>(dataContextInfo.DataContext, field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
884
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
885 ei.Queries[0].Parameters.Add(param);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
886
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
887 sqlQuery.Update.Items.Add(new SqlQuery.SetExpression(field, param.SqlParameter));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
888 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
889
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
890 foreach (var field in keys)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
891 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
892 var param = GetParameter<int>(dataContextInfo.DataContext, field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
893
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
894 ei.Queries[0].Parameters.Add(param);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
895
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
896 sqlQuery.Where.Field(field).Equal.Expr(param.SqlParameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
897
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
898 if (field.Nullable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
899 sqlQuery.IsParameterDependent = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
900 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
901
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
902 ei.SetNonQueryQuery();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
903
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
904 ObjectOperation<T>.Update.Add(key, ei);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
905 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
906
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
907 return (int)ei.GetElement(null, dataContextInfo, Expression.Constant(obj), null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
908 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
909
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
910 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
911
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
912 #region Delete
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
913
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
914 public static int Delete(IDataContextInfo dataContextInfo, T obj)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
915 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
916 if (Equals(default(T), obj))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
917 return 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
918
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
919 Query<int> ei;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
920
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
921 var key = new { dataContextInfo.MappingSchema, dataContextInfo.ContextID };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
922
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
923 if (!ObjectOperation<T>.Delete.TryGetValue(key, out ei))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
924 lock (_sync)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
925 if (!ObjectOperation<T>.Delete.TryGetValue(key, out ei))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
926 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
927 var sqlTable = new SqlTable<T>(dataContextInfo.MappingSchema);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
928 var sqlQuery = new SqlQuery { QueryType = QueryType.Delete };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
929
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
930 sqlQuery.From.Table(sqlTable);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
931
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
932 ei = new Query<int>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
933 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
934 MappingSchema = dataContextInfo.MappingSchema,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
935 ContextID = dataContextInfo.ContextID,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
936 CreateSqlProvider = dataContextInfo.CreateSqlProvider,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
937 Queries = { new Query<int>.QueryInfo { SqlQuery = sqlQuery, } }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
938 };
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
939
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
940 var keys = sqlTable.GetKeys(true).Cast<SqlField>().ToList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
941
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
942 if (keys.Count == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
943 throw new LinqException(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
944 string.Format("Table '{0}' does not have primary key.", sqlTable.Name));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
945
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
946 foreach (var field in keys)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
947 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
948 var param = GetParameter<int>(dataContextInfo.DataContext, field);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
949
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
950 ei.Queries[0].Parameters.Add(param);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
951
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
952 sqlQuery.Where.Field(field).Equal.Expr(param.SqlParameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
953
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
954 if (field.Nullable)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
955 sqlQuery.IsParameterDependent = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
956 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
957
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
958 ei.SetNonQueryQuery();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
959
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
960 ObjectOperation<T>.Delete.Add(key, ei);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
961 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
962
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
963 return (int)ei.GetElement(null, dataContextInfo, Expression.Constant(obj), null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
964 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
965
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
966 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
967
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
968 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
969
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
970 #region New Builder Support
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
971
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
972 public void SetElementQuery(Func<QueryContext,IDataContext,IDataReader,Expression,object[],object> mapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
973 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
974 FinalizeQuery();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
975
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
976 if (Queries.Count != 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
977 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
978
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
979 SqlProvider.SqlQuery = Queries[0].SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
980
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
981 GetElement = (ctx,db,expr,ps) => RunQuery(ctx, db,expr, ps, mapper);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
982 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
983
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
984 TE RunQuery<TE>(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
985 QueryContext ctx,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
986 IDataContextInfo dataContextInfo,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
987 Expression expr,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
988 object[] parameters,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
989 Func<QueryContext,IDataContext,IDataReader,Expression,object[],TE> mapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
990 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
991 var dataContext = dataContextInfo.DataContext;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
992
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
993 object query = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
994
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
995 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
996 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
997 query = SetCommand(dataContext, expr, parameters, 0);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
998
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
999 using (var dr = dataContext.ExecuteReader(query))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1000 while (dr.Read())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1001 return mapper(ctx, dataContext, dr, expr, parameters);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1002
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1003 return Array<TE>.Empty.First();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1004 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1005 finally
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1006 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1007 if (query != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1008 dataContext.ReleaseQuery(query);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1009
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1010 if (dataContextInfo.DisposeContext)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1011 dataContext.Dispose();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1012 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1013 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1014
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1015 Func<IDataContextInfo,Expression,object[],int,IEnumerable<IDataReader>> GetQuery()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1016 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1017 FinalizeQuery();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1018
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1019 if (Queries.Count != 1)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1020 throw new InvalidOperationException();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1021
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1022 Func<IDataContextInfo,Expression,object[],int,IEnumerable<IDataReader>> query = RunQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1023
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1024 SqlProvider.SqlQuery = Queries[0].SqlQuery;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1025
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1026 var select = Queries[0].SqlQuery.Select;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1027
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1028 if (select.SkipValue != null && !SqlProvider.IsSkipSupported)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1029 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1030 var q = query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1031
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1032 if (select.SkipValue is SqlValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1033 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1034 var n = (int)((IValueContainer)select.SkipValue).Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1035
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1036 if (n > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1037 query = (db, expr, ps, qn) => q(db, expr, ps, qn).Skip(n);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1038 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1039 else if (select.SkipValue is SqlParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1040 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1041 var i = GetParameterIndex(select.SkipValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1042 query = (db, expr, ps, qn) => q(db, expr, ps, qn).Skip((int)Queries[0].Parameters[i].Accessor(expr, ps));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1043 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1044 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1045
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1046 if (select.TakeValue != null && !SqlProvider.IsTakeSupported)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1047 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1048 var q = query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1049
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1050 if (select.TakeValue is SqlValue)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1051 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1052 var n = (int)((IValueContainer)select.TakeValue).Value;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1053
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1054 if (n > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1055 query = (db, expr, ps, qn) => q(db, expr, ps, qn).Take(n);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1056 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1057 else if (select.TakeValue is SqlParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1058 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1059 var i = GetParameterIndex(select.TakeValue);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1060 query = (db, expr, ps, qn) => q(db, expr, ps, qn).Take((int)Queries[0].Parameters[i].Accessor(expr, ps));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1061 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1062 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1063
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1064 return query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1065 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1066
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1067 internal void SetQuery(Func<QueryContext,IDataContext,IDataReader,Expression,object[],T> mapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1068 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1069 var query = GetQuery();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1070 GetIEnumerable = (ctx,db,expr,ps) => Map(query(db, expr, ps, 0), ctx, db, expr, ps, mapper);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1071 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1072
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1073 static IEnumerable<T> Map(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1074 IEnumerable<IDataReader> data,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1075 QueryContext queryContext,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1076 IDataContextInfo dataContextInfo,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1077 Expression expr,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1078 object[] ps,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1079 Func<QueryContext,IDataContext,IDataReader,Expression,object[],T> mapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1080 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1081 if (queryContext == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1082 queryContext = new QueryContext(dataContextInfo, expr, ps);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1083
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1084 foreach (var dr in data)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1085 yield return mapper(queryContext, dataContextInfo.DataContext, dr, expr, ps);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1086 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1087
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1088 internal void SetQuery(Func<QueryContext,IDataContext,IDataReader,Expression,object[],int,T> mapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1089 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1090 var query = GetQuery();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1091 GetIEnumerable = (ctx,db,expr,ps) => Map(query(db, expr, ps, 0), ctx, db, expr, ps, mapper);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1092 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1093
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1094 static IEnumerable<T> Map(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1095 IEnumerable<IDataReader> data,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1096 QueryContext queryContext,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1097 IDataContextInfo dataContextInfo,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1098 Expression expr,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1099 object[] ps,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1100 Func<QueryContext,IDataContext,IDataReader,Expression,object[],int,T> mapper)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1101 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1102 if (queryContext == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1103 queryContext = new QueryContext(dataContextInfo, expr, ps);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1104
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1105 var counter = 0;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1106
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1107 foreach (var dr in data)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1108 yield return mapper(queryContext, dataContextInfo.DataContext, dr, expr, ps, counter++);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1109 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1110
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1111 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1112 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1113
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1114 public class ParameterAccessor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1115 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1116 public Expression Expression;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1117 public Func<Expression,object[],object> Accessor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1118 public SqlParameter SqlParameter;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1119 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1120 }