@"(\s+(asc|ascending|desc|descending))?\s*$", RegexOptions.IgnoreCase); // order operators

        internal static IQueryable AsQueryable(object o)
        {
            IQueryable oQueryable = o as IQueryable;

            if (oQueryable != null)
            {
                return(oQueryable);
            }

            // Wrap strings in IEnumerable<string> instead of treating as IEnumerable<char>.
            string oString = o as string;

            if (oString != null)
            {
                return(Queryable.AsQueryable(new string[] { oString }));
            }

            IEnumerable oEnumerable = o as IEnumerable;

            if (oEnumerable != null)
            {
                // IEnumerable<T> can be directly converted to an IQueryable<T>.
                Type genericType = FindGenericEnumerableType(o.GetType());
                if (genericType != null)
                {
                    // The non-generic Queryable.AsQueryable gets called for array types, executing
                    // the FindGenericType logic again.  Might want to investigate way to avoid this.
                    return(Queryable.AsQueryable(oEnumerable));
                }
                // Wrap non-generic IEnumerables in IEnumerable<object>.
                List <object> genericList = new List <object>();
                foreach (object item in oEnumerable)
                {
                    genericList.Add(item);
                }
                return(Queryable.AsQueryable(genericList));
            }

            // Wrap non-IEnumerable types in IEnumerable<T>.
            Type  listType = typeof(List <>).MakeGenericType(o.GetType());
            IList list     = (IList)DataSourceHelper.CreateObjectInstance(listType);

            list.Add(o);
            return(Queryable.AsQueryable(list));
        }
 protected virtual object CreateContext(Type contextType)
 {
     return(DataSourceHelper.CreateObjectInstance(contextType));
 }