private IEnumerable<Expression> GetConcatenatedItems (MethodCallExpression methodCallExpression)
{
if (methodCallExpression.Arguments.Count == 1
&& (typeof (IEnumerable).IsAssignableFrom (methodCallExpression.Arguments[0].Type)
&& methodCallExpression.Arguments[0].Type != typeof (string)))
{
ConstantExpression argumentAsConstantExpression;
NewArrayExpression argumentAsNewArrayExpression;
if ((argumentAsNewArrayExpression = methodCallExpression.Arguments[0] as NewArrayExpression) != null)
{
return argumentAsNewArrayExpression.Expressions;
}
else if ((argumentAsConstantExpression = methodCallExpression.Arguments[0] as ConstantExpression) != null)
{
return ((object[]) argumentAsConstantExpression.Value).Select (element => (Expression) Expression.Constant (element));
}
else
{
var message = string.Format (
"The method call '{0}' is not supported. When the array overloads of String.Concat are used, only constant or new array expressions can "
+ "be translated to SQL; in this usage, the expression has type '{1}'.",
FormattingExpressionTreeVisitor.Format (methodCallExpression),
methodCallExpression.Arguments[0].GetType ());
throw new NotSupportedException (message);
}
}
else
{
return methodCallExpression.Arguments;
}
}
}