Skip to content

Commit 76c1f4b

Browse files
author
zzzprojects
committed
Add support to TPH
Add support to TPH
1 parent 4814178 commit 76c1f4b

23 files changed

+1411
-163
lines changed

src/shared/Z.EF.Plus.BatchUpdate.Shared/BatchUpdate.cs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -982,11 +982,25 @@ public List<Tuple<string, object>> GetInnerValues<T>(IQueryable<T> query, Expres
982982
#if EF5 || EF6
983983
// FIND the mapped column
984984
var column = mapping.ScalarProperties.Find(x => x.Name == value.Key);
985-
if (column == null)
986-
{
987-
throw new Exception("The destination column could not be found:" + value.Key);
988-
}
989-
var columnName = column.ColumnName;
985+
string columnName;
986+
987+
if (column != null)
988+
{
989+
columnName = column.ColumnName;
990+
}
991+
else
992+
{
993+
var accessor = mapping.ScalarAccessors.Find(x => x.AccessorPath == value.Key);
994+
if (accessor == null)
995+
{
996+
throw new Exception("The destination column could not be found:" + value.Key);
997+
}
998+
999+
columnName = accessor.ColumnName;
1000+
}
1001+
1002+
1003+
9901004
#elif EFCORE
9911005

9921006
var property = entity.FindProperty(value.Key);

src/shared/Z.EF.Plus.QueryFuture.Shared/BaseQueryFuture.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -279,9 +279,20 @@ public virtual IRelationalCommand CreateExecutorAndGetCommand(out RelationalQuer
279279
}
280280
else
281281
{
282-
// EF Core 2.1 Preview 2. We pass null for the DbContext, may require something else!
283-
var parameterExtractingExpressionVisitorConstructor = parameterExtractingExpressionVisitorConstructors.First(x => x.GetParameters().Length == 6);
284-
var parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] { evaluatableExpressionFilter, queryContext, logger, null, true, false });
282+
283+
var parameterExtractingExpressionVisitorConstructor = parameterExtractingExpressionVisitorConstructors.First(x => x.GetParameters().Length == 6);
284+
285+
ParameterExtractingExpressionVisitor parameterExtractingExpressionVisitor = null;
286+
287+
// EF Core 2.1
288+
if (parameterExtractingExpressionVisitorConstructor.GetParameters().Where(x => x.ParameterType == typeof(DbContext)).Any())
289+
{
290+
parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] { evaluatableExpressionFilter, queryContext, logger, context, true, false });
291+
}
292+
else
293+
{
294+
parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] { evaluatableExpressionFilter, queryContext, logger, null, true, false });
295+
}
285296

286297
// CREATE new query from query visitor
287298
newQuery = parameterExtractingExpressionVisitor.ExtractParameters(Query.Expression);

src/shared/Z.EF.Plus.QueryFuture.Shared/QueryFutureEnumerable.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,10 @@ public override void SetResult(DbDataReader reader)
135135

136136
var enumerator = GetQueryEnumerator<T>(reader);
137137

138-
SetResult(enumerator);
138+
using (enumerator)
139+
{
140+
SetResult(enumerator);
141+
}
139142
}
140143

141144
public void SetResult(IEnumerator<T> enumerator)

src/shared/Z.EF.Plus.QueryFuture.Shared/QueryFutureValue.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,15 @@ public override void SetResult(DbDataReader reader)
9191
}
9292

9393
var enumerator = GetQueryEnumerator<TResult>(reader);
94+
using (enumerator)
95+
{
96+
enumerator.MoveNext();
97+
_result = enumerator.Current;
9498

99+
}
100+
95101
// Enumerate on first item only
96-
enumerator.MoveNext();
97-
_result = enumerator.Current;
98-
102+
99103
HasValue = true;
100104
}
101105

src/shared/Z.EF.Plus._Core.Shared/EFCore/IQueryable`/CreateCommand.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,9 +208,21 @@ public static IRelationalCommand CreateCommand(this IQueryable source, out Relat
208208
}
209209
else
210210
{
211-
// EF Core 2.1 Preview 2. We pass null for the DbContext, may require something else!
211+
// EF Core 2.1 Preview 2.
212212
var parameterExtractingExpressionVisitorConstructor = parameterExtractingExpressionVisitorConstructors.First(x => x.GetParameters().Length == 6);
213-
var parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] { evaluatableExpressionFilter, queryContext, logger, null, true, false });
213+
var _context = queryContext.GetType().GetProperty("Context", BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy);
214+
var context = _context.GetValue(queryContext);
215+
216+
ParameterExtractingExpressionVisitor parameterExtractingExpressionVisitor = null;
217+
218+
if (parameterExtractingExpressionVisitorConstructor.GetParameters().Where(x => x.ParameterType == typeof(DbContext)).Any())
219+
{
220+
parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] { evaluatableExpressionFilter, queryContext, logger, context, true, false });
221+
}
222+
else
223+
{
224+
parameterExtractingExpressionVisitor = (ParameterExtractingExpressionVisitor)parameterExtractingExpressionVisitorConstructor.Invoke(new object[] { evaluatableExpressionFilter, queryContext, logger, null, true, false });
225+
}
214226

215227
// CREATE new query from query visitor
216228
newQuery = parameterExtractingExpressionVisitor.ExtractParameters(source.Expression);
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System.Collections.Generic;
2+
3+
namespace Z.EF.Plus.BatchUpdate.Shared.Extensions
4+
{
5+
public static partial class DbModelPlusExtentions
6+
{
7+
public static TValue GetValueOrNull<TKey, TValue>(this Dictionary<TKey, TValue> @this, TKey key) where TValue : class
8+
{
9+
if (@this.ContainsKey(key))
10+
{
11+
return @this[key];
12+
}
13+
14+
return null;
15+
}
16+
}
17+
}

src/shared/Z.EF.Plus._Core.Shared/Model/Extensions/GetTableDefinitions.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
namespace Z.EF.Plus.BatchUpdate.Shared.Extensions
1313
{
14-
public static class DbModelPlusExtentions
14+
public static partial class DbModelPlusExtentions
1515
{
1616
internal static IEnumerable<TableDefinition> GetTableDefinitions<T>(this DbModelPlus model)
1717
{
@@ -108,20 +108,20 @@ private static IEnumerable<TableDefinition> GetTableDefinitions(DbModelPlus mode
108108
ueEntity.Properties = setEntityType.EntityTypeMapping.MappingFragment.ScalarProperties.ToList();
109109

110110
//if there's no base type, stop here
111-
if (string.IsNullOrEmpty(setEntityType.BaseType))
111+
if (string.IsNullOrEmpty(setEntityType.BaseType.ToString()))
112112
{
113113
return lsTableDefinitions;
114114
}
115115
}
116116

117117
//stop here if there's no base type
118-
if (string.IsNullOrEmpty(setEntityType.BaseType))
118+
if (string.IsNullOrEmpty(setEntityType.BaseType.ToString()))
119119
{
120120
return lsTableDefinitions;
121121
}
122122

123123
//strip the alias bit
124-
string strBaseType = setEntityType.BaseType.Replace(model.ConceptualModel.Alias + ".", "");
124+
string strBaseType = setEntityType.BaseType.ToString().Replace(model.ConceptualModel.Alias + ".", "");
125125

126126
//get the columns for our base class
127127
IEnumerable<TableDefinition> lsBaseTableDefinitions = GetTableDefinitions(model, strBaseType);
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
// Copyright (c) 2014 Jonathan Magnan (http://jonathanmagnan.com).
2+
// All rights reserved (http://zzzproject.com/entity-framework-extensions/).
3+
// Licensed under MIT License (MIT) (http://zentityframework.codeplex.com/license).
4+
5+
#if FULL || BATCH_DELETE || BATCH_UPDATE
6+
#if EF5 || EF6
7+
using System;
8+
using System.ComponentModel;
9+
10+
namespace Z.EF.Plus.BatchUpdate.Shared.Extensions
11+
{
12+
public static partial class DbModelPlusExtentions
13+
{
14+
/// <summary>
15+
/// A System.Object extension method that toes the given this.
16+
/// </summary>
17+
/// <typeparam name="T">Generic type parameter.</typeparam>
18+
/// <param name="this">this.</param>
19+
/// <returns>A T.</returns>
20+
internal static T To<T>(this Object @this)
21+
{
22+
if (@this != null)
23+
{
24+
Type targetType = typeof(T);
25+
26+
if (@this.GetType() == targetType)
27+
{
28+
return (T) @this;
29+
}
30+
31+
TypeConverter converter = TypeDescriptor.GetConverter(@this);
32+
if (converter != null)
33+
{
34+
if (converter.CanConvertTo(targetType))
35+
{
36+
return (T) converter.ConvertTo(@this, targetType);
37+
}
38+
}
39+
40+
converter = TypeDescriptor.GetConverter(targetType);
41+
if (converter != null)
42+
{
43+
if (converter.CanConvertFrom(@this.GetType()))
44+
{
45+
return (T) converter.ConvertFrom(@this);
46+
}
47+
}
48+
49+
if (@this == DBNull.Value)
50+
{
51+
return (T) (object) null;
52+
}
53+
}
54+
55+
return (T) @this;
56+
}
57+
58+
/// <summary>
59+
/// A System.Object extension method that toes the given this.
60+
/// </summary>
61+
/// <param name="this">this.</param>
62+
/// <param name="type">The type.</param>
63+
/// <returns>An object.</returns>
64+
/// <example>
65+
/// <code>
66+
/// using System;
67+
/// using Microsoft.VisualStudio.TestTools.UnitTesting;
68+
///
69+
///
70+
/// namespace ExtensionMethods.Examples
71+
/// {
72+
/// [TestClass]
73+
/// public class System_Object_To
74+
/// {
75+
/// [TestMethod]
76+
/// public void To()
77+
/// {
78+
/// string nullValue = null;
79+
/// string value = &quot;1&quot;;
80+
/// object dbNullValue = DBNull.Value;
81+
///
82+
/// // Exemples
83+
/// var result1 = value.To&lt;int&gt;(); // return 1;
84+
/// var result2 = value.To&lt;int?&gt;(); // return 1;
85+
/// var result3 = nullValue.To&lt;int?&gt;(); // return null;
86+
/// var result4 = dbNullValue.To&lt;int?&gt;(); // return null;
87+
///
88+
/// // Unit Test
89+
/// Assert.AreEqual(1, result1);
90+
/// Assert.AreEqual(1, result2.Value);
91+
/// Assert.IsFalse(result3.HasValue);
92+
/// Assert.IsFalse(result4.HasValue);
93+
/// }
94+
/// }
95+
/// }
96+
/// </code>
97+
/// </example>
98+
/// <example>
99+
/// <code>
100+
/// using System;
101+
/// using Microsoft.VisualStudio.TestTools.UnitTesting;
102+
///
103+
///
104+
/// namespace ExtensionMethods.Examples
105+
/// {
106+
/// [TestClass]
107+
/// public class System_Object_To
108+
/// {
109+
/// [TestMethod]
110+
/// public void To()
111+
/// {
112+
/// string nullValue = null;
113+
/// string value = &quot;1&quot;;
114+
/// object dbNullValue = DBNull.Value;
115+
///
116+
/// // Exemples
117+
/// var result1 = value.To&lt;int&gt;(); // return 1;
118+
/// var result2 = value.To&lt;int?&gt;(); // return 1;
119+
/// var result3 = nullValue.To&lt;int?&gt;(); // return null;
120+
/// var result4 = dbNullValue.To&lt;int?&gt;(); // return null;
121+
///
122+
/// // Unit Test
123+
/// Assert.AreEqual(1, result1);
124+
/// Assert.AreEqual(1, result2.Value);
125+
/// Assert.IsFalse(result3.HasValue);
126+
/// Assert.IsFalse(result4.HasValue);
127+
/// }
128+
/// }
129+
/// }
130+
/// </code>
131+
/// </example>
132+
internal static object To(this Object @this, Type type)
133+
{
134+
if (@this != null)
135+
{
136+
Type targetType = type;
137+
138+
if (@this.GetType() == targetType)
139+
{
140+
return @this;
141+
}
142+
143+
TypeConverter converter = TypeDescriptor.GetConverter(@this);
144+
if (converter != null)
145+
{
146+
if (converter.CanConvertTo(targetType))
147+
{
148+
return converter.ConvertTo(@this, targetType);
149+
}
150+
}
151+
152+
converter = TypeDescriptor.GetConverter(targetType);
153+
if (converter != null)
154+
{
155+
if (converter.CanConvertFrom(@this.GetType()))
156+
{
157+
return converter.ConvertFrom(@this);
158+
}
159+
}
160+
161+
if (@this == DBNull.Value)
162+
{
163+
return null;
164+
}
165+
}
166+
167+
return @this;
168+
}
169+
}
170+
}
171+
#endif
172+
#endif

0 commit comments

Comments
 (0)