annotate Source/DataAccess/SqlQueryBase.cs @ 6:11b6da379593

Исправлена странная ошибка при использовании OfType<...>().Where(...)
author cin
date Mon, 05 Dec 2016 05:50:52 +0300
parents f990fcb411a9
children
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.Text;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using BLToolkit.Aspects;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using BLToolkit.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using BLToolkit.Data.DataProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using BLToolkit.Mapping;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 using BLToolkit.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 using BLToolkit.Reflection.Extension;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 namespace BLToolkit.DataAccess
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 public abstract class SqlQueryBase : DataAccessorBase
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 #region Constructors
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 protected SqlQueryBase()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 protected SqlQueryBase(DbManager dbManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 : base(dbManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 protected SqlQueryBase(DbManager dbManager, bool dispose)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 : base(dbManager, dispose)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 #region Protected Members
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 protected virtual MemberMapper[] GetFieldList(ObjectMapper om)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 var list = new List<MemberMapper>(om.Count);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 foreach (MemberMapper mm in om)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 if (mm.MapMemberInfo.SqlIgnore == false)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 list.Add(mm);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 return list.ToArray();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 protected virtual MemberMapper[] GetNonKeyFieldList(ObjectMapper om)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 var typeExt = TypeExtension.GetTypeExtension(om.TypeAccessor.OriginalType, Extensions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 var list = new List<MemberMapper>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 foreach (MemberMapper mm in om)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 if (mm.MapMemberInfo.SqlIgnore)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 var ma = mm.MapMemberInfo.MemberAccessor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 MappingSchema.MetadataProvider.GetPrimaryKeyOrder(om.TypeAccessor.OriginalType, typeExt, ma, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 if (!isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 list.Add(mm);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 return list.ToArray();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 struct MemberOrder
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 public MemberOrder(MemberMapper memberMapper, int order)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 MemberMapper = memberMapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 Order = order;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 public readonly MemberMapper MemberMapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 public readonly int Order;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84 private static readonly Hashtable _keyList = new Hashtable();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 protected internal virtual MemberMapper[] GetKeyFieldList(DbManager db, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 var key = type.FullName + "$" + db.DataProvider.UniqueName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 var mmList = (MemberMapper[])_keyList[key];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 if (mmList == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 var typeExt = TypeExtension.GetTypeExtension(type, Extensions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 var list = new List<MemberOrder>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 foreach (MemberMapper mm in db.MappingSchema.GetObjectMapper(type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 if (mm.MapMemberInfo.SqlIgnore)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 var ma = mm.MapMemberInfo.MemberAccessor;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 if (TypeHelper.IsScalar(ma.Type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 var order = MappingSchema.MetadataProvider.GetPrimaryKeyOrder(type, typeExt, ma, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 if (isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 list.Add(new MemberOrder(mm, order));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 list.Sort((x, y) => x.Order - y.Order);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 _keyList[key] = mmList = new MemberMapper[list.Count];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 for (var i = 0; i < list.Count; i++)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 mmList[i] = list[i].MemberMapper;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 return mmList;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 protected virtual void AddWherePK(DbManager db, SqlQueryInfo query, StringBuilder sb, int nParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 sb.Append("WHERE\n");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 var memberMappers = GetKeyFieldList(db, query.ObjectType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 if (memberMappers.Length == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 throw new DataAccessException(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134 string.Format("No primary key field(s) in the type '{0}'.", query.ObjectType.FullName));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 foreach (var mm in memberMappers)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 var p = query.AddParameter(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 db.DataProvider.Convert(mm.Name + "_W", ConvertType.NameToQueryParameter).ToString(),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 mm.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 sb.AppendFormat("\t{0} = ", db.DataProvider.Convert(p.FieldName, ConvertType.NameToQueryField));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 if (nParameter < 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 sb.AppendFormat("{0} AND\n", p.ParameterName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147 sb.AppendFormat("{{{0}}} AND\n", nParameter++);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 sb.Remove(sb.Length - 5, 5);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 protected SqlQueryInfo CreateSelectByKeySqlText(DbManager db, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 var om = db.MappingSchema.GetObjectMapper(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156 var sb = new StringBuilder();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 var query = new SqlQueryInfo(om);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 sb.Append("SELECT\n");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 foreach (var mm in GetFieldList(om))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 sb.AppendFormat("\t{0},\n",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 db.DataProvider.Convert(mm.Name, ConvertType.NameToQueryField));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 sb.Remove(sb.Length - 2, 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167 sb.Append("FROM\n\t");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 AppendTableName(sb, db, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 AddWherePK(db, query, sb, -1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 query.QueryText = sb.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175 return query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 // NOTE changed to virtual
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 protected virtual void AppendTableName(StringBuilder sb, DbManager db, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 var database = GetDatabaseName(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182 var owner = GetOwnerName (type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 var name = GetTableName (type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185 db.DataProvider.CreateSqlProvider().BuildTableName(sb,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 database == null ? null : db.DataProvider.Convert(database, ConvertType.NameToDatabase). ToString(),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 owner == null ? null : db.DataProvider.Convert(owner, ConvertType.NameToOwner). ToString(),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188 name == null ? null : db.DataProvider.Convert(name, ConvertType.NameToQueryTable).ToString());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 protected SqlQueryInfo CreateSelectAllSqlText(DbManager db, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 var om = db.MappingSchema.GetObjectMapper(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 var sb = new StringBuilder();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197 var query = new SqlQueryInfo(om);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 sb.Append("SELECT\n");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 foreach (var mm in GetFieldList(om))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 sb.AppendFormat("\t{0},\n",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 db.DataProvider.Convert(mm.Name, ConvertType.NameToQueryField));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 sb.Remove(sb.Length - 2, 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 sb.Append("FROM\n\t");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 AppendTableName(sb, db, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210 query.QueryText = sb.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212 return query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 protected SqlQueryInfo CreateInsertSqlText(DbManager db, Type type, int nParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217 var typeExt = TypeExtension.GetTypeExtension(type, Extensions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 var om = db.MappingSchema.GetObjectMapper(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219 var list = new List<MemberMapper>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 var sb = new StringBuilder();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 var query = new SqlQueryInfo(om);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 var mp = MappingSchema.MetadataProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 sb.Append("INSERT INTO ");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225 AppendTableName(sb, db, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 sb.Append(" (\n");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 foreach (var mm in GetFieldList(om))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 // IT: This works incorrectly for complex mappers.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232 // [2009-03-24] ili: use mm.MemberAccessor instead of mm.ComplexMemberAccessor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 // as in CreateUpdateSqlText
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 var nonUpdatableAttribute = mp.GetNonUpdatableAttribute(type, typeExt, mm.MapMemberInfo.MemberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 if (nonUpdatableAttribute == null || !isSet || nonUpdatableAttribute.OnInsert == false)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 sb.AppendFormat("\t{0},\n",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 db.DataProvider.Convert(mm.Name, ConvertType.NameToQueryField));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 list.Add(mm);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 sb.Remove(sb.Length - 2, 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 sb.Append(") VALUES (\n");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 foreach (var mm in list)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 var p = query.AddParameter(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 db.DataProvider.Convert(mm.Name + "_P", ConvertType.NameToQueryParameter).ToString(),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 mm.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 if (nParameter < 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 sb.AppendFormat("\t{0},\n", p.ParameterName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 //sb.AppendFormat("\t{0},\n", db.DataProvider.Convert(p.ParameterName, ConvertType.NameToQueryParameter));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 sb.AppendFormat("\t{{{0}}},\n", nParameter++);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264 sb.Remove(sb.Length - 2, 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266 sb.Append(")");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268 query.QueryText = sb.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 return query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 protected SqlQueryInfo CreateUpdateSqlText(DbManager db, Type type, int nParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 var typeExt = TypeExtension.GetTypeExtension(type, Extensions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 var om = db.MappingSchema.GetObjectMapper(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 var sb = new StringBuilder();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 var query = new SqlQueryInfo(om);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 var mp = MappingSchema.MetadataProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 sb.Append("UPDATE\n\t");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 AppendTableName(sb, db, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 sb.Append("\nSET\n");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 var fields = GetFieldList(om);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 var hasFields = false;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 foreach (var mm in fields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 bool isSet;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 var nonUpdatableAttribute = mp.GetNonUpdatableAttribute(type, typeExt, mm.MapMemberInfo.MemberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 if (nonUpdatableAttribute != null && isSet && nonUpdatableAttribute.OnUpdate == true)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 mp.GetPrimaryKeyOrder(type, typeExt, mm.MapMemberInfo.MemberAccessor, out isSet);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 if (isSet)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 hasFields = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 var p = query.AddParameter(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 db.DataProvider.Convert(mm.Name + "_P", ConvertType.NameToQueryParameter).ToString(),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 mm.Name);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308 sb.AppendFormat("\t{0} = ", db.DataProvider.Convert(p.FieldName, ConvertType.NameToQueryField));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310 if (nParameter < 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 sb.AppendFormat("{0},\n", p.ParameterName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 sb.AppendFormat("\t{{{0}}},\n", nParameter++);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316 if (!hasFields)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 throw new DataAccessException(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 string.Format("There are no fields to update in the type '{0}'.", query.ObjectType.FullName));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 sb.Remove(sb.Length - 2, 1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 AddWherePK(db, query, sb, nParameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324 query.QueryText = sb.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 return query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 protected SqlQueryInfo CreateDeleteSqlText(DbManager db, Type type, int nParameter)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 var om = db.MappingSchema.GetObjectMapper(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 var sb = new StringBuilder();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333 var query = new SqlQueryInfo(om);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 sb.Append("DELETE FROM\n\t");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 AppendTableName(sb, db, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337 sb.AppendLine();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 AddWherePK(db, query, sb, nParameter);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 query.QueryText = sb.ToString();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 return query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 protected virtual SqlQueryInfo CreateSqlText(DbManager db, Type type, string actionName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 switch (actionName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 case "SelectByKey": return CreateSelectByKeySqlText(db, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 case "SelectAll": return CreateSelectAllSqlText (db, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 case "Insert": return CreateInsertSqlText (db, type, -1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 case "InsertBatch": return CreateInsertSqlText (db, type, 0);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 case "Update": return CreateUpdateSqlText (db, type, -1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 case "UpdateBatch": return CreateUpdateSqlText (db, type, 0);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 case "Delete": return CreateDeleteSqlText (db, type, -1);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358 case "DeleteBatch": return CreateDeleteSqlText (db, type, 0);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 default:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360 throw new DataAccessException(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 string.Format("Unknown action '{0}'.", actionName));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 private static readonly Hashtable _actionSqlQueryInfo = new Hashtable();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367 [NoInterception]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 public virtual SqlQueryInfo GetSqlQueryInfo(DbManager db, Type type, string actionName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370 var key = type.FullName + "$" + actionName + "$" + db.DataProvider.UniqueName + "$" + GetTableName(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371 var query = (SqlQueryInfo)_actionSqlQueryInfo[key];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373 if (query == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 query = CreateSqlText(db, type, actionName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 _actionSqlQueryInfo[key] = query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379 return query;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 }