private string GetQueryableExpression(string name, IQueryable queryable)
{
var ce = queryable.Expression as ConstantExpression;
if (ce != null)
{
if (ce.Type.IsGenericType)
{
var gtd = ce.Type.GetGenericTypeDefinition();
if (gtd == typeof(Queryable<>))
return FromSqlSource(name, ce.Type.GetGenericArguments()[0]);
if (gtd == typeof(IQueryable<>))
return GetQuerySourceFromExpression(name, queryable.ElementType, queryable.Expression);
}
if (ce.Type.IsArray || ce.Value is Array)
return FormatStringArray(ce.Value, name, ce.Type);
else if (ce.Value is IEnumerable)
return FormatStringEnumerable(ce.Value, name, ce.Type);
//TODO this doesn't work most of the cases
return "(SELECT {0} AS \"{1}\") AS \"{1}\"".With(ce.Value, name);
}
var mce = queryable.Expression as MethodCallExpression;
if (mce != null && mce.Method.DeclaringType == typeof(System.Linq.Queryable) && mce.Method.Name == "Cast")
return GetQuerySourceFromExpression(name, queryable.ElementType, mce.Arguments[0]);
throw new NotSupportedException("unknown query source expression!");
}