Skip to content

Commit ced69c8

Browse files
ExpressionCompiler: ensure ReflectedType and DeclaringType match (#328)
1 parent 23be81e commit ced69c8

3 files changed

Lines changed: 58 additions & 1 deletion

File tree

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using System;
2+
using System.ComponentModel.DataAnnotations.Schema;
3+
using System.Linq;
4+
using System.Linq.Expressions;
5+
using Xunit;
6+
7+
namespace DevExtreme.AspNet.Data.Tests.EFCore2 {
8+
public class Bug326 {
9+
10+
public abstract class EntityBase {
11+
public int ID { get; set; }
12+
}
13+
14+
[Table(nameof(Bug326) + "_" + nameof(Entity))]
15+
public class Entity : EntityBase {
16+
public string Prop { get; set; }
17+
}
18+
19+
public class DTO : EntityBase {
20+
public string Prop { get; set; }
21+
}
22+
23+
[Fact]
24+
public void Scenario() {
25+
TestDbContext.Exec(context => {
26+
var dtoQuery = context.Set<Entity>().Select(i => new DTO { ID = i.ID, Prop = i.Prop });
27+
28+
Assert.Null(Record.Exception(delegate {
29+
var loadResult = DataSourceLoader.Load(dtoQuery, new SampleLoadOptions {
30+
Take = 1
31+
});
32+
33+
loadResult.data.Cast<object>().ToArray();
34+
}));
35+
});
36+
}
37+
38+
}
39+
40+
}

net/DevExtreme.AspNet.Data.Tests.EFCore2/TestDbContext.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) {
1717
modelBuilder.Entity<RemoteGrouping.DataItem>();
1818
modelBuilder.Entity<RemoteGroupingStress.DataItem>();
1919
modelBuilder.Entity<Summary.DataItem>();
20+
modelBuilder.Entity<Bug326.Entity>();
2021
}
2122

2223
public static void Exec(Action<TestDbContext> action) {

net/DevExtreme.AspNet.Data/ExpressionCompiler.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ protected internal Expression CompileAccessorExpression(Expression target, strin
4646
else if(DynamicBindingHelper.ShouldUseDynamicBinding(currentTarget.Type))
4747
currentTarget = DynamicBindingHelper.CompileGetMember(currentTarget, clientExprItem);
4848
else
49-
currentTarget = Expression.PropertyOrField(currentTarget, clientExprItem);
49+
currentTarget = FixReflectedType(Expression.PropertyOrField(currentTarget, clientExprItem));
5050

5151
progression.Add(currentTarget);
5252
}
@@ -114,6 +114,22 @@ static Expression ReadExpando(Expression expando, string member) {
114114
Expression.Constant(member)
115115
);
116116
}
117+
118+
static MemberExpression FixReflectedType(MemberExpression expr) {
119+
var member = expr.Member;
120+
var declaringType = member.DeclaringType;
121+
122+
if(member.ReflectedType != declaringType) {
123+
switch(member.MemberType) {
124+
case MemberTypes.Property:
125+
return Expression.Property(expr.Expression, declaringType, member.Name);
126+
case MemberTypes.Field:
127+
return Expression.Field(expr.Expression, declaringType, member.Name);
128+
}
129+
}
130+
131+
return expr;
132+
}
117133
}
118134

119135
}

0 commit comments

Comments
 (0)