|
15 | 15 | #if EF5 |
16 | 16 | using System.Data.Objects; |
17 | 17 | using System.Data.SqlClient; |
| 18 | +using System.Reflection; |
18 | 19 | using Z.EntityFramework.Plus.Internal.Core.SchemaObjectModel; |
19 | 20 |
|
20 | 21 | #elif EF6 |
@@ -192,6 +193,30 @@ public int Execute<T>(IQueryable<T> query, Expression<Func<T, T>> updateFactory) |
192 | 193 | } |
193 | 194 |
|
194 | 195 | #if EF5 || EF6 |
| 196 | + if (BatchUpdateManager.IsInMemoryQuery) |
| 197 | + { |
| 198 | + var list = query.ToList(); |
| 199 | + var compiled = updateFactory.Compile(); |
| 200 | + var memberBindings = ((MemberInitExpression)updateFactory.Body).Bindings; |
| 201 | + var accessors = memberBindings |
| 202 | + .Select(x => x.Member.Name) |
| 203 | + .Select(x => new PropertyOrFieldAccessor(typeof(T).GetProperty(x, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))) |
| 204 | + .ToList(); |
| 205 | + |
| 206 | + foreach (var item in list) |
| 207 | + { |
| 208 | + var newItem = compiled(item); |
| 209 | + |
| 210 | + foreach (var accessor in accessors) |
| 211 | + { |
| 212 | + var value = accessor.GetValue(newItem); |
| 213 | + accessor.SetValue(item, value); |
| 214 | + } |
| 215 | + } |
| 216 | + |
| 217 | + return list.Count; |
| 218 | + } |
| 219 | + |
195 | 220 | var dbContext = query.GetDbContext(); |
196 | 221 |
|
197 | 222 | #if EF6 |
@@ -994,6 +1019,11 @@ public List<Tuple<string, object>> GetInnerValues<T>(IQueryable<T> query, Expres |
994 | 1019 | valueSql = valueSql.Replace("AS [C1]", ""); |
995 | 1020 | valueSql = valueSql.Replace("AS `C1`", ""); |
996 | 1021 |
|
| 1022 | + if (valueSql.Trim().StartsWith("TOP") && valueSql.IndexOf(")") != -1) |
| 1023 | + { |
| 1024 | + valueSql = valueSql.Substring(valueSql.IndexOf(")") + 1); |
| 1025 | + } |
| 1026 | + |
997 | 1027 | var listReplace = new List<string>() |
998 | 1028 | { |
999 | 1029 | "[Extent1]", |
|
0 commit comments