Skip to content

Commit

Permalink
Merge pull request #402 from LuccaSA/fix_contains
Browse files Browse the repository at this point in the history
FIX : .contains on expresion on hierarchy
  • Loading branch information
Poltuu authored Mar 10, 2020
2 parents 5ea4067 + 3770742 commit d8e8b2d
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/Rdd.Domain/Helpers/Expressions/ExpressionParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,8 @@ private IExpression GetExpression(Type classType, string member)
if (typeof(IDictionary).IsAssignableFrom(classType))
{
var dictionaryKey = Expression.Constant(member);
var itemsExpression = Expression.Property(parameter, "Item", dictionaryKey);
var itemProperty = GetPropertyInfo(classType, "Item");
var itemsExpression = Expression.Property(parameter, itemProperty, dictionaryKey);

return new ItemExpression { LambdaExpression = Expression.Lambda(itemsExpression, parameter) };
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Collections.ObjectModel;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;

namespace Rdd.Domain.Helpers.Expressions.Utils
{
Expand Down Expand Up @@ -70,6 +71,12 @@ protected override Expression VisitMember(MemberExpression node)
{
var parameter = Expression.Parameter(node.Expression.Type);
var propertyExpression = Expression.PropertyOrField(parameter, node.Member.Name);
//Ef needs the property coming from the declaring type
if (propertyExpression.Member.ReflectedType != propertyExpression.Member.DeclaringType)
{
var property = propertyExpression.Member.DeclaringType.GetProperty(node.Member.Name, BindingFlags.FlattenHierarchy | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);
propertyExpression = Expression.Property(parameter, property);
}
var lambda = Expression.Lambda(propertyExpression, parameter);

if (typeof(IEnumerable).IsAssignableFrom(node.Expression.Type) && node.Expression.Type != typeof(string))
Expand Down
11 changes: 11 additions & 0 deletions test/Rdd.Web.Tests/Serialization/FieldsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,17 @@ public async Task SerializeSubCollections()

Assert.Equal(ExpectedInput(@"{""items"":[{""obj2s"":[{""id"":1,""name"":""1""},{""id"":2,""name"":""2""}]}]}"), json);
}

[Fact]
public void FieldsContainsOnHierarchy()
{
var tree = new ExpressionParser().ParseTree<Super>("value,value2,baseproperty,superproperty");

Assert.True(tree.Contains(s => s.SuperProperty));
Assert.True(tree.Contains(s => s.Value2));
Assert.True(tree.Contains(s => s.Value));
Assert.True(tree.Contains(s => s.BaseProperty));
}
}

public class Obj1 : IEntityBase<int>
Expand Down

0 comments on commit d8e8b2d

Please sign in to comment.