Skip to content

Commit e13a0fb

Browse files
authored
Merge pull request #29 from BlaiseD/master
ArgumentException: "Argument types do not match" when mapping Conditional filters.
2 parents 87ddbe7 + cd078ab commit e13a0fb

File tree

3 files changed

+66
-1
lines changed

3 files changed

+66
-1
lines changed

Directory.Build.props

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<Authors>Jimmy Bogard</Authors>
44
<LangVersion>latest</LangVersion>
5-
<VersionPrefix>2.0.0</VersionPrefix>
5+
<VersionPrefix>2.0.1-preview01</VersionPrefix>
66
<WarningsAsErrors>true</WarningsAsErrors>
77
<NoWarn>$(NoWarn);1701;1702;1591</NoWarn>
88
</PropertyGroup>

src/AutoMapper.Extensions.ExpressionMapping/XpressionMapperVisitor.cs

+13
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,19 @@ Expression DoVisitBinary(Expression newLeft, Expression newRight, Expression con
130130
}
131131
}
132132

133+
protected override Expression VisitConditional(ConditionalExpression c)
134+
{
135+
return DoVisitConditional(this.Visit(c.Test), this.Visit(c.IfTrue), this.Visit(c.IfFalse));
136+
137+
Expression DoVisitConditional(Expression test, Expression ifTrue, Expression ifFalse)
138+
{
139+
if (test != c.Test || ifTrue != c.IfTrue || ifFalse != c.IfFalse)
140+
return Expression.Condition(test, ifTrue, ifFalse);
141+
142+
return c;
143+
}
144+
}
145+
133146
protected override Expression VisitUnary(UnaryExpression node)
134147
{
135148
switch (node.NodeType)

tests/AutoMapper.Extensions.ExpressionMapping.UnitTests/XpressionMapperTests.cs

+52
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,51 @@ public void Map__object_including_child_and_grandchild()
176176
Assert.True(users.Count == 2);
177177
}
178178

179+
[Fact]
180+
public void Map__object_including_child_and_grandchild_with_conditional_filter()
181+
{
182+
//Arrange
183+
ParameterExpression userParam = Expression.Parameter(typeof(UserModel), "s");
184+
MemberExpression accountModelProperty = Expression.MakeMemberAccess(userParam, PrimitiveHelper.GetFieldOrProperty(typeof(UserModel), "AccountModel"));
185+
MemberExpression branchModelProperty = Expression.MakeMemberAccess(accountModelProperty, PrimitiveHelper.GetFieldOrProperty(typeof(AccountModel), "Branch"));
186+
MemberExpression nameProperty = Expression.MakeMemberAccess(branchModelProperty, PrimitiveHelper.GetFieldOrProperty(typeof(BranchModel), "Name"));
187+
188+
//{s => (IIF((IIF((s.AccountModel == null), null, s.AccountModel.Branch) == null), null, s.AccountModel.Branch.Name) == "Leeds")}
189+
Expression<Func<UserModel, bool>> selection = Expression.Lambda<Func<UserModel, bool>>
190+
(
191+
Expression.Equal
192+
(
193+
Expression.Condition
194+
(
195+
Expression.Equal
196+
(
197+
Expression.Condition
198+
(
199+
Expression.Equal
200+
(
201+
accountModelProperty,
202+
Expression.Constant(null, typeof(AccountModel))
203+
),
204+
Expression.Constant(null, typeof(BranchModel)),
205+
branchModelProperty
206+
),
207+
Expression.Constant(null, typeof(BranchModel))
208+
),
209+
Expression.Constant(null, typeof(string)),
210+
nameProperty
211+
),
212+
Expression.Constant("Park Row", typeof(string))
213+
),
214+
userParam
215+
);
216+
217+
Expression<Func<User, bool>> selectionMapped = mapper.Map<Expression<Func<User, bool>>>(selection);
218+
List<User> users = Users.Where(selectionMapped).ToList();
219+
220+
//Assert
221+
Assert.True(users.Count == 1);
222+
}
223+
179224
[Fact]
180225
public void Map_object_when_null_values_are_typed()
181226
{
@@ -783,6 +828,7 @@ public AccountModel()
783828
public string Description { get; set; }
784829
public string Type { get; set; }
785830
public DateTime DateCreated { get; set; }
831+
public BranchModel Branch { get; set; }
786832
public ICollection<ThingModel> ThingModels { get; set; }
787833
public ICollection<UserModel> UserModels { get; set; }
788834
}
@@ -827,6 +873,12 @@ public class Branch
827873
public string Name { get; set; }
828874
}
829875

876+
public class BranchModel
877+
{
878+
public int Id { get; set; }
879+
public string Name { get; set; }
880+
}
881+
830882
public class UserVM
831883
{
832884
public string Name { get; set; }

0 commit comments

Comments
 (0)