Skip to content

Commit 917de95

Browse files
committed
#53 identified an issue that resulted in a non entity not resolving the property value and attempting to map to db.
1 parent d25b1eb commit 917de95

File tree

5 files changed

+44
-8
lines changed

5 files changed

+44
-8
lines changed

SubSonic.Core.DataAccessLayer/src/Builders/DbWherePredicateBuilder/DbWherePredicateBuilder.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -240,11 +240,10 @@ public Expression ParseLambda(Expression predicate)
240240
return body;
241241
}
242242

243-
private static DbTableExpression GetDbTable(Type type) => __instances
244-
.Select(builder =>
245-
builder.table)
246-
.Single(table =>
247-
table.Type.GenericTypeArguments[0] == type || table.Type.GenericTypeArguments[0].IsSubclassOf(type));
243+
private IEnumerable<DbTableExpression> DbTables => __instances.Select(builder => builder.table);
244+
245+
private DbTableExpression GetDbTable(Type type) => DbTables.Single(table =>
246+
table.Type.GenericTypeArguments[0] == type || table.Type.GenericTypeArguments[0].IsSubclassOf(type));
248247

249248
private Expression GetDbColumnExpression(PropertyInfo propertyInfo)
250249
{

SubSonic.Core.DataAccessLayer/src/Builders/DbWherePredicateBuilder/DbWherePredicateBuilderVisit.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,9 +344,23 @@ protected override Expression VisitMember(MemberExpression node)
344344
{
345345
if (node.Expression is MemberExpression member)
346346
{
347-
if (member.Expression is ConstantExpression value)
347+
if (member.Expression is ConstantExpression constant)
348348
{
349-
return VisitMemberExtended(node);
349+
if (DbTables.Any(x => x.Type.GenericTypeArguments[0] == node.Member.DeclaringType))
350+
{
351+
return VisitMemberExtended(node);
352+
}
353+
else if (member.Member is FieldInfo field)
354+
{
355+
object value = field.GetValue(constant.Value);
356+
357+
if (node.Member is PropertyInfo property)
358+
{
359+
value = property.GetValue(value);
360+
}
361+
362+
return Visit(Expression.Constant(value));
363+
}
350364
}
351365
else
352366
{

SubSonic.Tests/DAL/ExtensionMethod/ExtensionMethodTests.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,5 +133,11 @@ public void TheAverageMethodIsSupported()
133133

134134
renter.Person.Renters.Average(x => x.Rent).Should().Be(Renters.Where(x => x.PersonID == renter.PersonID).Average(x => x.Rent));
135135
}
136+
137+
[Test]
138+
public void TheSingleMethodIsSupported()
139+
{
140+
Person person = Context.People.Single(x => x.ID == 1);
141+
}
136142
}
137143
}

SubSonic.Tests/DAL/ExtensionMethod/IncludeExtensionMethodTests.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ public void CanGetMemberInitializedUsingDatasource()
4545
{
4646
iterated = true;
4747

48-
view.FullName.Should().Be(People.Single(x => x.ID == view.PersonID).FullName);
48+
var person = Context.People.Single(x => x.ID == view.PersonID);
49+
50+
view.FullName.Should().Be(person.FullName);
4951
}
5052

5153
Context.Database.Instance.RecievedCommand(@"SELECT [T1].[PersonID], [T2].[FullName], [T1].[Rent], [T1].[UnitID], COALESCE([T3].[HasParallelPowerGeneration], 0) AS [HasParallelPowerGeneration], [T4].[Name] AS [Status]

SubSonic.Tests/DAL/SUT/BaseTestFixture.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,21 @@ protected DataTable BuildDataTable<TEntity>(IEnumerable<TEntity> entities)
339339
}
340340
);
341341
}
342+
else if (typeof(TEntity) == typeof(RenterView))
343+
{
344+
Parallel.ForEach(entities, entity =>
345+
{
346+
if (entity is RenterView renterView)
347+
{
348+
var person = People.Single(x => x.ID == renterView.PersonID);
349+
350+
renterView.FullName = String.Format("{0}, {1}{2}",
351+
person.FamilyName, person.FirstName,
352+
string.IsNullOrEmpty(person.MiddleInitial?.Trim()) ? "" : $" {person.MiddleInitial}.");
353+
}
354+
}
355+
);
356+
}
342357

343358
DataTable data = entities.ToDataTable();
344359

0 commit comments

Comments
 (0)