private static KeyValuePair <string, object>[] TryResolvePropertyExpression(
MappingResolverStub mappingResolver, Expression expression, object value)
{
var columnExpression = expression as SqlColumnExpression;
if (columnExpression != null)
{
return new[] { new KeyValuePair <string, object> (columnExpression.ColumnName, value) }
}
;
var newExpression = expression as NewExpression;
if (newExpression != null)
{
return
(newExpression.Arguments.SelectMany(
(a, i) =>
{
var argumentMemberValue = value != null ? ((PropertyInfo)newExpression.Members[i]).GetValue(value, null) : null;
return TryResolvePropertyExpression(mappingResolver, a, argumentMemberValue);
}).ToArray());
}
var namedExpression = expression as NamedExpression;
if (namedExpression != null)
{
return(TryResolvePropertyExpression(mappingResolver, namedExpression.Expression, value));
}
var memberRefExpression = (SqlEntityRefMemberExpression)expression;
var optimizedIdentity = mappingResolver.TryResolveOptimizedIdentity(memberRefExpression);
if (optimizedIdentity == null)
{
return(new KeyValuePair <string, object> [0]);
}
var idOfReferencedEntity = value != null?value.GetType().GetProperty("ID").GetValue(value, null) : null;
return(TryResolvePropertyExpression(mappingResolver, optimizedIdentity, idOfReferencedEntity));
}