Skip to content

Commit 23c10b0

Browse files
committed
fix: EF 7+ bug around projection composition
1 parent 7cbbe27 commit 23c10b0

File tree

3 files changed

+71
-2
lines changed

3 files changed

+71
-2
lines changed

src/QueryableValues.SqlServer/QueryableValuesEntity.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,20 @@
11
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
24

35
namespace BlazarTech.QueryableValues
46
{
57
internal class QueryableValuesEntity
68
{
9+
private static readonly IReadOnlyList<string> DataPropertyNames;
10+
711
public const string IndexPropertyName = nameof(X);
812

13+
static QueryableValuesEntity()
14+
{
15+
DataPropertyNames = GetDataPropertyNames();
16+
}
17+
918
public int X { get; set; }
1019

1120
public int? I { get; set; }
@@ -150,5 +159,38 @@ internal class QueryableValuesEntity
150159
public char? C7 { get; set; }
151160
public char? C8 { get; set; }
152161
public char? C9 { get; set; }
162+
163+
private static List<string> GetDataPropertyNames()
164+
{
165+
var properties = typeof(QueryableValuesEntity).GetProperties();
166+
var result = new List<string>(properties.Length);
167+
168+
foreach (var property in properties)
169+
{
170+
if (property.Name is IndexPropertyName)
171+
{
172+
continue;
173+
}
174+
175+
result.Add(property.Name);
176+
}
177+
178+
return result;
179+
}
180+
181+
internal static IEnumerable<string> GetUnmappedPropertyNames(IReadOnlyList<EntityPropertyMapping> mappings)
182+
{
183+
var targetProperties = new HashSet<string>(mappings.Select(i => i.Target.Name));
184+
185+
foreach (var propertyName in DataPropertyNames)
186+
{
187+
if (targetProperties.Contains(propertyName))
188+
{
189+
continue;
190+
}
191+
192+
yield return propertyName;
193+
}
194+
}
153195
}
154196
}

src/QueryableValues.SqlServer/SqlServer/JsonQueryableFactory.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ protected override string GetSqlForComplexTypes(IEntityOptionsBuilder entityOpti
4343
sb.Append(", [").Append(mapping.Target.Name).Append(']');
4444
}
4545

46+
foreach (var unmappedPropertyName in QueryableValuesEntity.GetUnmappedPropertyNames(mappings))
47+
{
48+
sb.Append(", NULL[").Append(unmappedPropertyName).Append(']');
49+
}
50+
4651
sb.AppendLine();
4752
sb.Append("FROM OPENJSON({0}) WITH ([").Append(QueryableValuesEntity.IndexPropertyName).Append("] int");
4853

src/QueryableValues.SqlServer/SqlServer/XmlQueryableFactory.cs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ protected override string GetSqlForComplexTypes(IEntityOptionsBuilder entityOpti
4141
sb
4242
.Append("\tI.value('@")
4343
.Append(QueryableValuesEntity.IndexPropertyName)
44-
.Append(" cast as xs:integer?', 'int') AS [")
44+
.Append(" cast as xs:integer?', 'int') [")
4545
.Append(QueryableValuesEntity.IndexPropertyName)
4646
.Append(']');
4747

@@ -117,9 +117,11 @@ protected override string GetSqlForComplexTypes(IEntityOptionsBuilder entityOpti
117117
throw new NotImplementedException(mapping.TypeName.ToString());
118118
}
119119

120-
sb.Append(") AS [").Append(targetName).Append(']');
120+
sb.Append(") [").Append(targetName).Append(']');
121121
}
122122

123+
AppendUnmappedProperties(sb, mappings);
124+
123125
sb.AppendLine();
124126
sb.Append("FROM {0}.nodes('/R[1]/V') N(I)").AppendLine();
125127
sb.Append("ORDER BY [").Append(QueryableValuesEntity.IndexPropertyName).Append(']');
@@ -130,6 +132,26 @@ protected override string GetSqlForComplexTypes(IEntityOptionsBuilder entityOpti
130132
{
131133
StringBuilderPool.Return(sb);
132134
}
135+
136+
static void AppendUnmappedProperties(System.Text.StringBuilder sb, IReadOnlyList< EntityPropertyMapping> mappings)
137+
{
138+
var hasUnmappedProperty = false;
139+
140+
foreach (var unmappedPropertyName in QueryableValuesEntity.GetUnmappedPropertyNames(mappings))
141+
{
142+
if (hasUnmappedProperty)
143+
{
144+
sb.Append(',');
145+
}
146+
else
147+
{
148+
hasUnmappedProperty = true;
149+
sb.Append(',').AppendLine().Append('\t');
150+
}
151+
152+
sb.Append("NULL[").Append(unmappedPropertyName).Append(']');
153+
}
154+
}
133155
}
134156
}
135157
}

0 commit comments

Comments
 (0)