Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Core / System / Linq / IQueryable.cs / 1305376 / IQueryable.cs
using System; using System.Collections; using System.Collections.Generic; using System.Linq.Expressions; using System.Reflection; using System.Text; // Include Silverlight's managed resources #if SILVERLIGHT using System.Core; #endif //SILVERLIGHT namespace System.Linq { public interface IQueryable : IEnumerable { Expression Expression { get; } Type ElementType { get; } // the provider that created this query IQueryProvider Provider { get; } } #if SILVERLIGHT public interface IQueryable: IEnumerable , IQueryable { #else public interface IQueryable : IEnumerable , IQueryable { #endif } public interface IQueryProvider{ IQueryable CreateQuery(Expression expression); IQueryable CreateQuery (Expression expression); object Execute(Expression expression); TResult Execute (Expression expression); } public interface IOrderedQueryable : IQueryable { } #if SILVERLIGHT public interface IOrderedQueryable : IQueryable , IOrderedQueryable { #else public interface IOrderedQueryable : IQueryable , IOrderedQueryable { #endif } public static class Queryable { public static IQueryable AsQueryable (this IEnumerable source) { if (source == null) throw Error.ArgumentNull("source"); if (source is IQueryable ) return (IQueryable )source; return new EnumerableQuery (source); } public static IQueryable AsQueryable(this IEnumerable source) { if (source == null) throw Error.ArgumentNull("source"); if (source is IQueryable) return (IQueryable)source; Type enumType = TypeHelper.FindGenericType(typeof(IEnumerable<>), source.GetType()); if (enumType == null) throw Error.ArgumentNotIEnumerableGeneric("source"); return EnumerableQuery.Create(enumType.GetGenericArguments()[0], source); } public static IQueryable Where (this IQueryable source, Expression > predicate) { if (source == null) throw Error.ArgumentNull("source"); if (predicate == null) throw Error.ArgumentNull("predicate"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)), new Expression[] { source.Expression, Expression.Quote(predicate) } )); } public static IQueryable Where (this IQueryable source, Expression > predicate) { if (source == null) throw Error.ArgumentNull("source"); if (predicate == null) throw Error.ArgumentNull("predicate"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)), new Expression[] { source.Expression, Expression.Quote(predicate) } )); } public static IQueryable OfType (this IQueryable source) { if (source == null) throw Error.ArgumentNull("source"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TResult)), new Expression[] { source.Expression } )); } public static IQueryable Cast (this IQueryable source) { if (source == null) throw Error.ArgumentNull("source"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TResult)), new Expression[] { source.Expression } )); } public static IQueryable Select (this IQueryable source, Expression > selector) { if (source == null) throw Error.ArgumentNull("source"); if (selector == null) throw Error.ArgumentNull("selector"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TResult)), new Expression[] { source.Expression, Expression.Quote(selector) } )); } public static IQueryable Select (this IQueryable source, Expression > selector) { if (source == null) throw Error.ArgumentNull("source"); if (selector == null) throw Error.ArgumentNull("selector"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TResult)), new Expression[] { source.Expression, Expression.Quote(selector) } )); } public static IQueryable SelectMany (this IQueryable source, Expression >> selector) { if (source == null) throw Error.ArgumentNull("source"); if (selector == null) throw Error.ArgumentNull("selector"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TResult)), new Expression[] { source.Expression, Expression.Quote(selector) } )); } public static IQueryable SelectMany (this IQueryable source, Expression >> selector) { if (source == null) throw Error.ArgumentNull("source"); if (selector == null) throw Error.ArgumentNull("selector"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TResult)), new Expression[] { source.Expression, Expression.Quote(selector) } )); } public static IQueryable SelectMany (this IQueryable source, Expression >> collectionSelector, Expression > resultSelector){ if (source == null) throw Error.ArgumentNull("source"); if (collectionSelector == null) throw Error.ArgumentNull("collectionSelector"); if (resultSelector == null) throw Error.ArgumentNull("resultSelector"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TCollection), typeof(TResult)), new Expression[] { source.Expression, Expression.Quote(collectionSelector), Expression.Quote(resultSelector) } )); } public static IQueryable SelectMany (this IQueryable source, Expression >> collectionSelector, Expression > resultSelector) { if (source == null) throw Error.ArgumentNull("source"); if (collectionSelector == null) throw Error.ArgumentNull("collectionSelector"); if (resultSelector == null) throw Error.ArgumentNull("resultSelector"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TCollection), typeof(TResult)), new Expression[] { source.Expression, Expression.Quote(collectionSelector), Expression.Quote(resultSelector) } )); } private static Expression GetSourceExpression (IEnumerable source) { IQueryable q = source as IQueryable ; if (q != null) return q.Expression; return Expression.Constant(source, typeof(IEnumerable )); } public static IQueryable Join (this IQueryable outer, IEnumerable inner, Expression > outerKeySelector, Expression > innerKeySelector, Expression > resultSelector) { if (outer == null) throw Error.ArgumentNull("outer"); if (inner == null) throw Error.ArgumentNull("inner"); if (outerKeySelector == null) throw Error.ArgumentNull("outerKeySelector"); if (innerKeySelector == null) throw Error.ArgumentNull("innerKeySelector"); if (resultSelector == null) throw Error.ArgumentNull("resultSelector"); return outer.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TOuter), typeof(TInner), typeof(TKey), typeof(TResult)), new Expression[] { outer.Expression, GetSourceExpression(inner), Expression.Quote(outerKeySelector), Expression.Quote(innerKeySelector), Expression.Quote(resultSelector) } )); } public static IQueryable Join (this IQueryable outer, IEnumerable inner, Expression > outerKeySelector, Expression > innerKeySelector, Expression > resultSelector, IEqualityComparer comparer) { if (outer == null) throw Error.ArgumentNull("outer"); if (inner == null) throw Error.ArgumentNull("inner"); if (outerKeySelector == null) throw Error.ArgumentNull("outerKeySelector"); if (innerKeySelector == null) throw Error.ArgumentNull("innerKeySelector"); if (resultSelector == null) throw Error.ArgumentNull("resultSelector"); return outer.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TOuter), typeof(TInner), typeof(TKey), typeof(TResult)), new Expression[] { outer.Expression, GetSourceExpression(inner), Expression.Quote(outerKeySelector), Expression.Quote(innerKeySelector), Expression.Quote(resultSelector), Expression.Constant(comparer, typeof(IEqualityComparer )) } )); } public static IQueryable GroupJoin (this IQueryable outer, IEnumerable inner, Expression > outerKeySelector, Expression > innerKeySelector, Expression , TResult>> resultSelector) { if (outer == null) throw Error.ArgumentNull("outer"); if (inner == null) throw Error.ArgumentNull("inner"); if (outerKeySelector == null) throw Error.ArgumentNull("outerKeySelector"); if (innerKeySelector == null) throw Error.ArgumentNull("innerKeySelector"); if (resultSelector == null) throw Error.ArgumentNull("resultSelector"); return outer.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TOuter), typeof(TInner), typeof(TKey), typeof(TResult)), new Expression[] { outer.Expression, GetSourceExpression(inner), Expression.Quote(outerKeySelector), Expression.Quote(innerKeySelector), Expression.Quote(resultSelector) } )); } public static IQueryable GroupJoin (this IQueryable outer, IEnumerable inner, Expression > outerKeySelector, Expression > innerKeySelector, Expression , TResult>> resultSelector, IEqualityComparer comparer) { if (outer == null) throw Error.ArgumentNull("outer"); if (inner == null) throw Error.ArgumentNull("inner"); if (outerKeySelector == null) throw Error.ArgumentNull("outerKeySelector"); if (innerKeySelector == null) throw Error.ArgumentNull("innerKeySelector"); if (resultSelector == null) throw Error.ArgumentNull("resultSelector"); return outer.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TOuter), typeof(TInner), typeof(TKey), typeof(TResult)), new Expression[] { outer.Expression, GetSourceExpression(inner), Expression.Quote(outerKeySelector), Expression.Quote(innerKeySelector), Expression.Quote(resultSelector), Expression.Constant(comparer, typeof(IEqualityComparer )) } )); } public static IOrderedQueryable OrderBy (this IQueryable source, Expression > keySelector) { if (source == null) throw Error.ArgumentNull("source"); if (keySelector == null) throw Error.ArgumentNull("keySelector"); return (IOrderedQueryable ) source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey)), new Expression[] { source.Expression, Expression.Quote(keySelector) } )); } public static IOrderedQueryable OrderBy (this IQueryable source, Expression > keySelector, IComparer comparer) { if (source == null) throw Error.ArgumentNull("source"); if (keySelector == null) throw Error.ArgumentNull("keySelector"); return (IOrderedQueryable ) source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey)), new Expression[] { source.Expression, Expression.Quote(keySelector), Expression.Constant(comparer, typeof(IComparer )) } )); } public static IOrderedQueryable OrderByDescending (this IQueryable source, Expression > keySelector) { if (source == null) throw Error.ArgumentNull("source"); if (keySelector == null) throw Error.ArgumentNull("keySelector"); return (IOrderedQueryable ) source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey)), new Expression[] { source.Expression, Expression.Quote(keySelector) } )); } public static IOrderedQueryable OrderByDescending (this IQueryable source, Expression > keySelector, IComparer comparer) { if (source == null) throw Error.ArgumentNull("source"); if (keySelector == null) throw Error.ArgumentNull("keySelector"); return (IOrderedQueryable ) source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey)), new Expression[] { source.Expression, Expression.Quote(keySelector), Expression.Constant(comparer, typeof(IComparer )) } )); } public static IOrderedQueryable ThenBy (this IOrderedQueryable source, Expression > keySelector) { if (source == null) throw Error.ArgumentNull("source"); if (keySelector == null) throw Error.ArgumentNull("keySelector"); return (IOrderedQueryable ) source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey)), new Expression[] { source.Expression, Expression.Quote(keySelector) } )); } public static IOrderedQueryable ThenBy (this IOrderedQueryable source, Expression > keySelector, IComparer comparer) { if (source == null) throw Error.ArgumentNull("source"); if (keySelector == null) throw Error.ArgumentNull("keySelector"); return (IOrderedQueryable ) source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey)), new Expression[] { source.Expression, Expression.Quote(keySelector), Expression.Constant(comparer, typeof(IComparer )) } )); } public static IOrderedQueryable ThenByDescending (this IOrderedQueryable source, Expression > keySelector) { if (source == null) throw Error.ArgumentNull("source"); if (keySelector == null) throw Error.ArgumentNull("keySelector"); return (IOrderedQueryable ) source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey)), new Expression[] { source.Expression, Expression.Quote(keySelector) } )); } public static IOrderedQueryable ThenByDescending (this IOrderedQueryable source, Expression > keySelector, IComparer comparer) { if (source == null) throw Error.ArgumentNull("source"); if (keySelector == null) throw Error.ArgumentNull("keySelector"); return (IOrderedQueryable ) source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey)), new Expression[] { source.Expression, Expression.Quote(keySelector), Expression.Constant(comparer, typeof(IComparer )) } )); } public static IQueryable Take (this IQueryable source, int count) { if (source == null) throw Error.ArgumentNull("source"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)), new Expression[] { source.Expression, Expression.Constant(count) } )); } public static IQueryable TakeWhile (this IQueryable source, Expression > predicate) { if (source == null) throw Error.ArgumentNull("source"); if (predicate == null) throw Error.ArgumentNull("predicate"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)), new Expression[] { source.Expression, Expression.Quote(predicate) } )); } public static IQueryable TakeWhile (this IQueryable source, Expression > predicate) { if (source == null) throw Error.ArgumentNull("source"); if (predicate == null) throw Error.ArgumentNull("predicate"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)), new Expression[] { source.Expression, Expression.Quote(predicate) } )); } public static IQueryable Skip (this IQueryable source, int count) { if (source == null) throw Error.ArgumentNull("source"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)), new Expression[] { source.Expression, Expression.Constant(count) } )); } public static IQueryable SkipWhile (this IQueryable source, Expression > predicate) { if (source == null) throw Error.ArgumentNull("source"); if (predicate == null) throw Error.ArgumentNull("predicate"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)), new Expression[] { source.Expression, Expression.Quote(predicate) } )); } public static IQueryable SkipWhile (this IQueryable source, Expression > predicate) { if (source == null) throw Error.ArgumentNull("source"); if (predicate == null) throw Error.ArgumentNull("predicate"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource)), new Expression[] { source.Expression, Expression.Quote(predicate) } )); } public static IQueryable > GroupBy (this IQueryable source, Expression > keySelector) { if (source == null) throw Error.ArgumentNull("source"); if (keySelector == null) throw Error.ArgumentNull("keySelector"); return source.Provider.CreateQuery >( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey)), new Expression[] { source.Expression, Expression.Quote(keySelector) } )); } public static IQueryable > GroupBy (this IQueryable source, Expression > keySelector, Expression > elementSelector) { if (source == null) throw Error.ArgumentNull("source"); if (keySelector == null) throw Error.ArgumentNull("keySelector"); if (elementSelector == null) throw Error.ArgumentNull("elementSelector"); return source.Provider.CreateQuery >( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey), typeof(TElement)), new Expression[] { source.Expression, Expression.Quote(keySelector), Expression.Quote(elementSelector) } )); } public static IQueryable > GroupBy (this IQueryable source, Expression > keySelector, IEqualityComparer comparer) { if (source == null) throw Error.ArgumentNull("source"); if (keySelector == null) throw Error.ArgumentNull("keySelector"); return source.Provider.CreateQuery >( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey)), new Expression[] { source.Expression, Expression.Quote(keySelector), Expression.Constant(comparer, typeof(IEqualityComparer )) } )); } public static IQueryable > GroupBy (this IQueryable source, Expression > keySelector, Expression > elementSelector, IEqualityComparer comparer) { if (source == null) throw Error.ArgumentNull("source"); if (keySelector == null) throw Error.ArgumentNull("keySelector"); if (elementSelector == null) throw Error.ArgumentNull("elementSelector"); return source.Provider.CreateQuery >( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey), typeof(TElement)), new Expression[] { source.Expression, Expression.Quote(keySelector), Expression.Quote(elementSelector), Expression.Constant(comparer, typeof(IEqualityComparer )) } )); } public static IQueryable GroupBy (this IQueryable source, Expression > keySelector, Expression > elementSelector, Expression , TResult>> resultSelector) { if (source == null) throw Error.ArgumentNull("source"); if (keySelector == null) throw Error.ArgumentNull("keySelector"); if (elementSelector == null) throw Error.ArgumentNull("elementSelector"); if (resultSelector == null) throw Error.ArgumentNull("resultSelector"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey), typeof(TElement), typeof(TResult)), new Expression[] { source.Expression, Expression.Quote(keySelector), Expression.Quote(elementSelector), Expression.Quote(resultSelector) } )); } public static IQueryable GroupBy (this IQueryable source, Expression > keySelector,Expression , TResult>> resultSelector) { if (source == null) throw Error.ArgumentNull("source"); if (keySelector == null) throw Error.ArgumentNull("keySelector"); if (resultSelector == null) throw Error.ArgumentNull("resultSelector"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey), typeof(TResult)), new Expression[] { source.Expression, Expression.Quote(keySelector), Expression.Quote(resultSelector) } )); } public static IQueryable GroupBy (this IQueryable source, Expression > keySelector, Expression , TResult>> resultSelector, IEqualityComparer comparer) { if (source == null) throw Error.ArgumentNull("source"); if (keySelector == null) throw Error.ArgumentNull("keySelector"); if (resultSelector == null) throw Error.ArgumentNull("resultSelector"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey), typeof(TResult)), new Expression[] { source.Expression, Expression.Quote(keySelector), Expression.Quote(resultSelector), Expression.Constant(comparer, typeof(IEqualityComparer )) } )); } public static IQueryable GroupBy (this IQueryable source, Expression > keySelector, Expression > elementSelector, Expression , TResult>> resultSelector, IEqualityComparer comparer) { if (source == null) throw Error.ArgumentNull("source"); if (keySelector == null) throw Error.ArgumentNull("keySelector"); if (elementSelector == null) throw Error.ArgumentNull("elementSelector"); if (resultSelector == null) throw Error.ArgumentNull("resultSelector"); return source.Provider.CreateQuery ( Expression.Call( null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TSource), typeof(TKey), typeof(TElement), typeof(TResult)), new Expression[] { source.Expression, Expression.Quote(keySelector), Expression.Quote(elementSelector), Expression.Quote(resultSelector), Expression.Constant(comparer, typeof(IEqualityComparer )) } )); } public static IQueryable Distinct (this IQueryable source) { if (source == null) throw Error.ArgumentNull("source"); return source.Provider.CreateQuery