diff options
author | Jb Evain <jbevain@gmail.com> | 2008-02-02 00:12:20 +0300 |
---|---|---|
committer | Jb Evain <jbevain@gmail.com> | 2008-02-02 00:12:20 +0300 |
commit | 4404e6aecb815ae06089688398c34aa9b9b61c63 (patch) | |
tree | 72f102d1ade4eff9e5d7bee41eb1c110716ebdb4 /mcs/class/System.Core/System.Linq/Queryable.cs | |
parent | cdfaafd2793d439b4ccc4ccd3873b151966ceff4 (diff) |
2008-02-01 Jb Evain <jbevain@novell.com>
* Queryable.cs, Check.cs: integrate GHOP work from
Andreas Noever <andreas.noever@gmail.com>.
svn path=/trunk/mcs/; revision=94569
Diffstat (limited to 'mcs/class/System.Core/System.Linq/Queryable.cs')
-rw-r--r-- | mcs/class/System.Core/System.Linq/Queryable.cs | 1779 |
1 files changed, 1258 insertions, 521 deletions
diff --git a/mcs/class/System.Core/System.Linq/Queryable.cs b/mcs/class/System.Core/System.Linq/Queryable.cs index 2b460f80cf8..1d096d9ac18 100644 --- a/mcs/class/System.Core/System.Linq/Queryable.cs +++ b/mcs/class/System.Core/System.Linq/Queryable.cs @@ -5,8 +5,9 @@ // Marek Safar (marek.safar@gmail.com) // Alejandro Serrano "Serras" (trupill@yahoo.es) // Jb Evain (jbevain@novell.com) +// Andreas Noever (andreas.noever@gmail.com) // -// Copyright (C) 2007 Novell, Inc (http://www.novell.com) +// Copyright (C) 2008 Novell, Inc (http://www.novell.com) // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the @@ -32,6 +33,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Reflection; +using System.Linq; namespace System.Linq { @@ -55,798 +57,1533 @@ namespace System.Linq { source.Expression)); } - public static int Count<TSource> (this IQueryable<TSource> source) + #region Aggregate + + public static TSource Aggregate<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, TSource, TSource>> func) { - Check.Source (source); + Check.SourceAndFunc (source, func); + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (func))); + } - return source.Execute<int, TSource> (MethodBase.GetCurrentMethod ()); + public static TAccumulate Aggregate<TSource, TAccumulate> (this IQueryable<TSource> source, TAccumulate seed, Expression<Func<TAccumulate, TSource, TAccumulate>> func) + { + Check.SourceAndFunc (source, func); + return source.Provider.Execute<TAccumulate> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TAccumulate)), + source.Expression, + Expression.Constant (seed), + Expression.Quote (func))); } - public static int Count<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) + public static TResult Aggregate<TSource, TAccumulate, TResult> (this IQueryable<TSource> source, TAccumulate seed, Expression<Func<TAccumulate, TSource, TAccumulate>> func, Expression<Func<TAccumulate, TResult>> selector) + { + Check.SourceAndFuncAndSelector (source, func, selector); + return source.Provider.Execute<TResult> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TAccumulate), typeof (TResult)), + source.Expression, + Expression.Constant (seed), + Expression.Quote (func), + Expression.Quote (selector))); + } + + #endregion + + #region All + + public static bool All<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) { Check.SourceAndPredicate (source, predicate); - return source.Provider.Execute<int> ( + return source.Provider.Execute<bool> ( StaticCall ( MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), source.Expression, Expression.Quote (predicate))); } - public static long LongCount<TSource> (this IQueryable<TSource> source) + #endregion + + #region Any + + public static bool Any<TSource> (this IQueryable<TSource> source) { Check.Source (source); - return source.Execute<long, TSource> (MethodBase.GetCurrentMethod ()); + return source.Provider.Execute<bool> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression)); } - public static long LongCount<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) + public static bool Any<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) { Check.SourceAndPredicate (source, predicate); - return source.Provider.Execute<long> ( + return source.Provider.Execute<bool> ( StaticCall ( MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), source.Expression, Expression.Quote (predicate))); } - public static int Sum (this IQueryable<int> source) - { - Check.Source (source); + #endregion - return source.Provider.Execute<int> ( - StaticCall ( - (MethodInfo) MethodBase.GetCurrentMethod (), - source.Expression)); - } - - public static int Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, int>> selector) - { - throw new NotImplementedException (); - } - - public static int? Sum (this IQueryable<int?> source) + #region AsQueryable + + public static IQueryable<TElement> AsQueryable<TElement> (this IEnumerable<TElement> source) { + if (source is IQueryable<TElement>) + return (IQueryable<TElement>) source; throw new NotImplementedException (); } - - public static int? Sum<TSource> ( - this IQueryable<TSource> source, - Func<TSource, int?> selector) + + public static IQueryable AsQueryable (this IQueryable source) { throw new NotImplementedException (); } - public static long Sum (this IQueryable<long> source) + #endregion + + #region Average + + public static int Average (this IQueryable<int> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<int> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - - public static long Sum<TSource> ( - this IQueryable<TSource> source, - Func<TSource, long> selector) + + public static int? Average (this IQueryable<int?> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<int?> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - - public static long? Sum (this IQueryable<long?> source) + + public static long Average (this IQueryable<long> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<long> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - - public static long? Sum<TSource> ( - this IQueryable<TSource> source, - Func<TSource, long?> selector) + + public static long? Average (this IQueryable<long?> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<long?> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - - public static double Sum (this IQueryable<double> source) + + public static float Average (this IQueryable<float> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<float> ( + StaticCall ( + (MethodInfo) (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - - public static double Sum<TSource> ( - this IQueryable<TSource> source, - Func<TSource, double> selector) + + public static float? Average (this IQueryable<float?> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<float?> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - - public static double? Sum (this IQueryable<double?> source) + + public static double Average (this IQueryable<double> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<double> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - - public static double? Sum<TSource> ( - this IQueryable<TSource> source, - Func<TSource, double?> selector) + + public static double? Average (this IQueryable<double?> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<double?> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - - public static decimal Sum (this IQueryable<decimal> source) + + public static decimal Average (this IQueryable<decimal> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<decimal> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - - public static decimal Sum<TSource> ( - this IQueryable<TSource> source, - Func<TSource, decimal> selector) + + public static decimal? Average (this IQueryable<decimal?> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<decimal?> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - public static decimal? Sum (this IQueryable<decimal?> source) + public static int Average<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, int>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<int> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - public static decimal? Sum<TSource> ( - this IQueryable<TSource> source, - Func<TSource, decimal?> selector) + public static int? Average<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, int?>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<int?> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - public static int Min (this IQueryable<int> source) + public static long Average<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, long>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<long> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - - public static int? Min (this IQueryable<int?> source) + + public static long? Average<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, long?>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<long?> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - - public static long Min (this IQueryable<long> source) + + public static float Average<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, float>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<float> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - - public static long? Min (this IQueryable<long?> source) + + public static float? Average<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, float?>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<float?> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - - public static double Min (this IQueryable<double> source) + + public static double Average<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, double>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<double> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - - public static double? Min (this IQueryable<double?> source) + + public static double? Average<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, double?>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<double?> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - - public static decimal Min (this IQueryable<decimal> source) + + public static decimal Average<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, decimal>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<decimal> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - - public static decimal? Min (this IQueryable<decimal?> source) + + public static decimal? Average<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, decimal?>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<decimal?> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - - public static TSource Min<TSource> (this IQueryable<TSource> source) + + #endregion + + #region Cast + + public static IQueryable<TResult> Cast<TResult> (this IQueryable source) { - throw new NotImplementedException (); + Check.Source (source); + + return (IQueryable<TResult>) source.Provider.CreateQuery ( + StaticCall (MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TResult)), + source.Expression)); } - - public static int Min<TSource> ( - this IQueryable<TSource> source, - Func<TSource, int> selector) + + #endregion + + #region Concat + + public static IQueryable<TSource> Concat<TSource> (this IQueryable<TSource> source1, IEnumerable<TSource> source2) { - throw new NotImplementedException (); + Check.Source1AndSource2 (source1, source2); + + return source1.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source1.Expression, + Expression.Constant (source2))); } - - public static int? Min<TSource> ( - this IQueryable<TSource> source, - Func<TSource, int?> selector) + + #endregion + + #region Contains + + public static bool Contains<TSource> (this IQueryable<TSource> source, TSource item) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<bool> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Constant (item))); } - - public static long Min<TSource> ( - this IQueryable<TSource> source, - Func<TSource, long> selector) + + public static bool Contains<TSource> (this IQueryable<TSource> source, TSource item, IEqualityComparer<TSource> comparer) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<bool> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Constant (item), + Expression.Constant (comparer))); } - - public static long? Min<TSource> ( - this IQueryable<TSource> source, - Func<TSource, long?> selector) + + #endregion + + #region Count + + public static int Count<TSource> (this IQueryable<TSource> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Execute<int, TSource> (MethodBase.GetCurrentMethod ()); } - - public static double Min<TSource> ( - this IQueryable<TSource> source, - Func<TSource, double> selector) + + public static int Count<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) { - throw new NotImplementedException (); + Check.SourceAndPredicate (source, predicate); + + return source.Provider.Execute<int> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (predicate))); } - - public static double? Min<TSource> ( - this IQueryable<TSource> source, - Func<TSource, double?> selector) + + #endregion + + #region DefaultIfEmpty + + public static TSource DefaultIfEmpty<TSource> (this IQueryable<TSource> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression)); } - - public static decimal Min<TSource> ( - this IQueryable<TSource> source, - Func<TSource, decimal> selector) + + public static TSource DefaultIfEmpty<TSource> (this IQueryable<TSource> source, TSource defaultValue) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Constant (defaultValue))); } - - public static decimal? Min<TSource> ( - this IQueryable<TSource> source, - Func<TSource, decimal?> selector) + + #endregion + + #region Distinct + + public static bool Distinct<TSource> (this IQueryable<TSource> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<bool> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression)); } - - public static TResult Min<TSource, TResult> ( - this IQueryable<TSource> source, - Func<TSource, TResult> selector) + + public static bool Distinct<TSource> (this IQueryable<TSource> source, IEqualityComparer<TSource> comparer) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<bool> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Constant (comparer))); } - - public static int Max (this IQueryable<int> source) + + #endregion + + #region ElementAt + + public static TSource ElementAt<TSource> (this IQueryable<TSource> source, int index) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Constant (index))); } - - public static int? Max (this IQueryable<int?> source) + + #endregion + + #region ElementAtOrDefault + + public static TSource ElementAtOrDefault<TSource> (this IQueryable<TSource> source, int index) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Constant (index))); } - - public static long Max (this IQueryable<long> source) + + #endregion + + #region Except + + public static IQueryable<TSource> Except<TSource> (this IQueryable<TSource> source1, IEnumerable<TSource> source2) { - throw new NotImplementedException (); + Check.Source1AndSource2 (source1, source2); + + return source1.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source1.Expression, + Expression.Constant (source2))); } - - public static long? Max (this IQueryable<long?> source) + + public static IQueryable<TSource> Except<TSource> (this IQueryable<TSource> source1, IEnumerable<TSource> source2, IEqualityComparer<TSource> comparer) { - throw new NotImplementedException (); + Check.Source1AndSource2 (source1, source2); + + return source1.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source1.Expression, + Expression.Constant (source2), + Expression.Constant (comparer))); } - - public static double Max ( - this IQueryable<double> source) + + #endregion + + #region First + + public static TSource First<TSource> (this IQueryable<TSource> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression)); } - - public static double? Max ( - this IQueryable<double?> source) + + public static TSource First<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) { - throw new NotImplementedException (); + Check.SourceAndPredicate (source, predicate); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (predicate))); } - - public static decimal Max ( - this IQueryable<decimal> source) + + #endregion + + #region FirstOrDefault + + public static TSource FirstOrDefault<TSource> (this IQueryable<TSource> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression)); } - - public static decimal? Max ( - this IQueryable<decimal?> source) + + public static TSource FirstOrDefault<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) { - throw new NotImplementedException (); + Check.SourceAndPredicate (source, predicate); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (predicate))); } - - public static TSource Max<TSource> ( - this IQueryable<TSource> source) + + #endregion + + #region GroupBy + + public static IQueryable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector) { - throw new NotImplementedException (); + Check.SourceAndKeySelector (source, keySelector); + + return source.Provider.Execute<IQueryable<IGrouping<TKey, TSource>>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)), + source.Expression, + Expression.Quote (keySelector))); } - - public static int Max<TSource> ( - this IQueryable<TSource> source, - Func<TSource, int> selector) + public static IQueryable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IEqualityComparer<TKey> comparer) { - throw new NotImplementedException (); + Check.SourceAndKeySelector (source, keySelector); + + return source.Provider.Execute<IQueryable<IGrouping<TKey, TSource>>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)), + source.Expression, + Expression.Quote (keySelector), + Expression.Constant (comparer))); } - - public static int? Max<TSource> ( - this IQueryable<TSource> source, - Func<TSource, int?> selector) + public static IQueryable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey, TElement> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TSource, TElement>> elementSelector) { - throw new NotImplementedException (); + Check.SourceAndKeyElementSelectors (source, keySelector, elementSelector); + + return source.Provider.Execute<IQueryable<IGrouping<TKey, TSource>>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey), typeof (TElement)), + source.Expression, + Expression.Quote (keySelector), + Expression.Quote (elementSelector))); } - - public static long Max<TSource> ( - this IQueryable<TSource> source, - Func<TSource, long> selector) + public static IQueryable<TResult> GroupBy<TSource, TKey, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TKey, IEnumerable<TSource>, TResult>> resultSelector) { - throw new NotImplementedException (); + Check.SourceAndKeyResultSelectors (source, keySelector, resultSelector); + + return source.Provider.Execute<IQueryable<TResult>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey), typeof (TResult)), + source.Expression, + Expression.Quote (keySelector), + Expression.Quote (resultSelector))); } - - public static long? Max<TSource> ( - this IQueryable<TSource> source, - Func<TSource, long?> selector) + public static IQueryable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TSource, TElement>> elementSelector, IEqualityComparer<TKey> comparer) { - throw new NotImplementedException (); + Check.SourceAndKeyElementSelectors (source, keySelector, elementSelector); + + return source.Provider.Execute<IQueryable<IGrouping<TKey, TElement>>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey), typeof (TElement)), + source.Expression, + Expression.Quote (keySelector), + Expression.Quote (elementSelector), + Expression.Constant (comparer))); } - - public static double Max<TSource> ( - this IQueryable<TSource> source, - Func<TSource, double> selector) + public static IQueryable<TResult> GroupBy<TSource, TKey, TElement, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TSource, TElement>> elementSelector, Expression<Func<TKey, IEnumerable<TElement>, TResult>> resultSelector) { - throw new NotImplementedException (); + Check.GroupBySelectors (source, keySelector, elementSelector, resultSelector); + + return source.Provider.Execute<IQueryable<TResult>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey), typeof (TElement), typeof (TResult)), + source.Expression, + Expression.Quote (keySelector), + Expression.Quote (elementSelector), + Expression.Quote (resultSelector))); } - - public static double? Max<TSource> ( - this IQueryable<TSource> source, - Func<TSource, double?> selector) + + public static IQueryable<TResult> GroupBy<TSource, TKey, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TKey, IEnumerable<TSource>, TResult>> resultSelector, IEqualityComparer<TKey> comparer) { - throw new NotImplementedException (); + Check.SourceAndKeyResultSelectors (source, keySelector, resultSelector); + + return source.Provider.Execute<IQueryable<TResult>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey), typeof (TResult)), + source.Expression, + Expression.Quote (keySelector), + Expression.Quote (resultSelector), + Expression.Constant (comparer))); } - - public static decimal Max<TSource> ( - this IQueryable<TSource> source, - Func<TSource, decimal> selector) + public static IQueryable<TResult> GroupBy<TSource, TKey, TElement, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TSource, TElement>> elementSelector, Expression<Func<TKey, IEnumerable<TElement>, TResult>> resultSelector, IEqualityComparer<TKey> comparer) { - throw new NotImplementedException (); + Check.GroupBySelectors (source, keySelector, elementSelector, resultSelector); + + return source.Provider.Execute<IQueryable<TResult>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey), typeof (TElement), typeof (TResult)), + source.Expression, + Expression.Quote (keySelector), + Expression.Quote (elementSelector), + Expression.Quote (resultSelector), + Expression.Constant (comparer))); } - - public static decimal? Max<TSource> ( - this IQueryable<TSource> source, - Func<TSource, decimal?> selector) - { - throw new NotImplementedException (); + #endregion + + #region GroupJoin + + public static IQueryable<TResult> GroupJoin<TOuter, TInner, TKey, TResult> (this IQueryable<TOuter> outer, IEnumerable<TInner> inner, Expression<Func<TOuter, TKey>> outerKeySelector, Expression<Func<TInner, TKey>> innerKeySelector, Expression<Func<TOuter, IEnumerable<TInner>, TResult>> resultSelector) + { + if (outer == null) + throw new ArgumentNullException ("outer"); + if (inner == null) + throw new ArgumentNullException ("inner"); + if (outerKeySelector == null) + throw new ArgumentNullException ("outerKeySelector"); + if (innerKeySelector == null) + throw new ArgumentNullException ("innerKeySelector"); + if (resultSelector == null) + throw new ArgumentNullException ("resultSelector"); + + return outer.Provider.Execute<IQueryable<TResult>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TOuter), typeof (TInner), typeof (TKey), typeof (TResult)), + outer.Expression, + Expression.Constant (inner), + Expression.Quote (outerKeySelector), + Expression.Quote (innerKeySelector), + Expression.Quote (resultSelector))); } - - public static TResult Max<TSource, TResult> ( - this IQueryable<TSource> source, - Func<TSource, TResult> selector) - { - throw new NotImplementedException (); + + public static IQueryable<TResult> GroupJoin<TOuter, TInner, TKey, TResult> (this IQueryable<TOuter> outer, IEnumerable<TInner> inner, Expression<Func<TOuter, TKey>> outerKeySelector, Expression<Func<TInner, TKey>> innerKeySelector, Expression<Func<TOuter, IEnumerable<TInner>, TResult>> resultSelector, IEqualityComparer<TKey> comparer) + { + if (outer == null) + throw new ArgumentNullException ("outer"); + if (inner == null) + throw new ArgumentNullException ("inner"); + if (outerKeySelector == null) + throw new ArgumentNullException ("outerKeySelector"); + if (innerKeySelector == null) + throw new ArgumentNullException ("innerKeySelector"); + if (resultSelector == null) + throw new ArgumentNullException ("resultSelector"); + + return outer.Provider.Execute<IQueryable<TResult>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TOuter), typeof (TInner), typeof (TKey), typeof (TResult)), + outer.Expression, + Expression.Constant (inner), + Expression.Quote (outerKeySelector), + Expression.Quote (innerKeySelector), + Expression.Quote (resultSelector), + Expression.Constant (comparer))); } - - public static double Average (this IQueryable<int> source) + + #endregion + + #region Intersect + + public static IQueryable<TSource> Intersect<TSource> (this IQueryable<TSource> source1, IEnumerable<TSource> source2) { - throw new NotImplementedException (); + Check.Source1AndSource2 (source1, source2); + + return source1.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source1.Expression, + Expression.Constant (source2))); } - - public static double? Average (this IQueryable<int?> source) + + public static IQueryable<TSource> Intersect<TSource> (this IQueryable<TSource> source1, IEnumerable<TSource> source2, IEqualityComparer<TSource> comparer) { - throw new NotImplementedException (); + Check.Source1AndSource2 (source1, source2); + + return source1.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source1.Expression, + Expression.Constant (source2), + Expression.Constant (comparer))); } - - public static double Average (this IQueryable<long> source) + + #endregion + + #region Join + + public static IQueryable<TResult> Join<TOuter, TInner, TKey, TResult> (this IQueryable<TOuter> outer, IEnumerable<TInner> inner, Expression<Func<TOuter, TKey>> outerKeySelector, Expression<Func<TInner, TKey>> innerKeySelector, Expression<Func<TOuter, TInner, TResult>> resultSelector) { - throw new NotImplementedException (); + Check.JoinSelectors (outer, inner, outerKeySelector, innerKeySelector, resultSelector); + + return outer.Provider.Execute<IQueryable<TResult>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TOuter), typeof (TInner), typeof (TKey), typeof (TResult)), + outer.Expression, + Expression.Constant (inner), + Expression.Quote (outerKeySelector), + Expression.Quote (innerKeySelector), + Expression.Quote (resultSelector))); } - - public static double? Average (this IQueryable<long?> source) + + public static IQueryable<TResult> Join<TOuter, TInner, TKey, TResult> (this IQueryable<TOuter> outer, IEnumerable<TInner> inner, Expression<Func<TOuter, TKey>> outerKeySelector, Expression<Func<TInner, TKey>> innerKeySelector, Expression<Func<TOuter, TInner, TResult>> resultSelector, IEqualityComparer<TKey> comparer) { - throw new NotImplementedException (); + Check.JoinSelectors (outer, inner, outerKeySelector, innerKeySelector, resultSelector); + + return outer.Provider.Execute<IQueryable<TResult>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TOuter), typeof (TInner), typeof (TKey), typeof (TResult)), + outer.Expression, + Expression.Constant (inner), + Expression.Quote (outerKeySelector), + Expression.Quote (innerKeySelector), + Expression.Quote (resultSelector), + Expression.Constant (comparer))); } - - public static double Average (this IQueryable<double> source) + + + #endregion + + #region Last + + public static TSource Last<TSource> (this IQueryable<TSource> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression)); } - - public static double? Average (this IQueryable<double?> source) + + public static TSource Last<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) { - throw new NotImplementedException (); + Check.SourceAndPredicate (source, predicate); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (predicate))); } - - public static decimal Average (this IQueryable<decimal> source) + + #endregion + + #region LastOrDefault + + public static TSource LastOrDefault<TSource> (this IQueryable<TSource> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression)); } - - public static decimal? Average (this IQueryable<decimal?> source) + + public static TSource LastOrDefault<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) { - throw new NotImplementedException (); + Check.SourceAndPredicate (source, predicate); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (predicate))); } - - public static double Average<TSource> (this IQueryable<TSource> source, - Func<TSource, int> selector) + + #endregion + + #region LongCount + + public static long LongCount<TSource> (this IQueryable<TSource> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Execute<long, TSource> (MethodBase.GetCurrentMethod ()); } - - public static double? Average<TSource> (this IQueryable<TSource> source, - Func<TSource, int?> selector) + + public static long LongCount<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) { - throw new NotImplementedException (); + Check.SourceAndPredicate (source, predicate); + + return source.Provider.Execute<long> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (predicate))); } - - public static double Average<TSource> (this IQueryable<TSource> source, - Func<TSource, long> selector) + + #endregion + + #region Max + + public static TSource Max<TSource> (this IQueryable<TSource> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression)); } - - public static double? Average<TSource> (this IQueryable<TSource> source, - Func<TSource, long?> selector) + + public static TResult Max<TSource, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<TResult> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TResult)), + source.Expression, + Expression.Quote (selector))); } - - public static double Average<TSource> (this IQueryable<TSource> source, - Func<TSource, double> selector) + + + #endregion + + #region Min + + public static TSource Min<TSource> (this IQueryable<TSource> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression)); } - - public static double? Average<TSource> (this IQueryable<TSource> source, - Func<TSource, double?> selector) + + public static TResult Min<TSource, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<TResult> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TResult)), + source.Expression, + Expression.Quote (selector))); } - - public static decimal Average<TSource> (this IQueryable<TSource> source, - Func<TSource, decimal> selector) + + + #endregion + + #region OfType + + public static IQueryable<TResult> OfType<TResult> (this IQueryable source) { - throw new NotImplementedException (); + Check.Source (source); + + return (IQueryable<TResult>) source.Provider.CreateQuery ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TResult)), + source.Expression)); } - - public static decimal? Average<TSource> (this IQueryable<TSource> source, - Func<TSource, decimal?> selector) + + #endregion + + #region OrderBy + + public static IQueryable<TSource> OrderBy<TSource, TKey> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector) { - throw new NotImplementedException (); + Check.SourceAndKeySelector (source, keySelector); + + return source.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)), + source.Expression, + Expression.Quote (keySelector))); } - - public static TSource Aggregate<TSource> ( - this IQueryable<TSource> source, - Func<TSource, TSource, TSource> func) + + public static IQueryable<TSource> OrderBy<TSource, TKey> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer) { - throw new NotImplementedException (); + Check.SourceAndKeySelector (source, keySelector); + + return source.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)), + source.Expression, + Expression.Quote (keySelector), + Expression.Constant (comparer))); } - - public static U Aggregate<TSource, U> ( - this IQueryable<TSource> source, - U seed, - Func<U, TSource, U> func) + + #endregion + + #region OrderByDescending + + public static IQueryable<TSource> OrderByDescending<TSource, TKey> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector) { - throw new NotImplementedException (); + Check.SourceAndKeySelector (source, keySelector); + + return source.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)), + source.Expression, + Expression.Quote (keySelector))); } - public static IEnumerable<TSource> Concat<TSource> ( - this IQueryable<TSource> first, - IEnumerable<TSource> second) + public static IQueryable<TSource> OrderByDescending<TSource, TKey> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer) { - throw new NotImplementedException (); + Check.SourceAndKeySelector (source, keySelector); + + return source.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)), + source.Expression, + Expression.Quote (keySelector), + Expression.Constant (comparer))); } - - public static IEnumerable<TResult> OfType<TResult> (this IQueryable source) - { - throw new NotImplementedException (); - } - public static IEnumerable<TResult> Cast<TResult> (this IQueryable source) + #endregion + + #region Reverse + + public static IQueryable<TSource> Reverse<TSource> (this IQueryable<TSource> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression)); } - - public static TSource First<TSource> (this IQueryable<TSource> source) + + #endregion + + #region Select + + public static IQueryable<TResult> Select<TSource, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<IQueryable<TResult>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TResult)), + source.Expression, + Expression.Quote (selector))); } - - public static TSource First<TSource> ( - this IQueryable<TSource> source, - Func<TSource, bool> predicate) + + public static IQueryable<TResult> Select<TSource, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, int, TResult>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<IQueryable<TResult>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TResult)), + source.Expression, + Expression.Quote (selector))); } - - public static TSource FirstOrDefault<TSource> (this IQueryable<TSource> source) + + #endregion + + #region SelectMany + + public static IQueryable<TResult> SelectMany<TSource, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, IEnumerable<TResult>>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<IQueryable<TResult>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TResult)), + source.Expression, + Expression.Quote (selector))); } - - public static TSource FirstOrDefault<TSource> ( - this IQueryable<TSource> source, - Func<TSource, bool> predicate) + + public static IQueryable<TResult> SelectMany<TSource, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, int, IEnumerable<TResult>>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<IQueryable<TResult>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TResult)), + source.Expression, + Expression.Quote (selector))); } - - public static TSource Last<TSource> (this IQueryable<TSource> source) + + public static IQueryable<TResult> SelectMany<TSource, TCollection, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, int, IEnumerable<TCollection>>> collectionSelector, Expression<Func<TSource, TCollection, TResult>> resultSelector) { - throw new NotImplementedException (); + Check.SourceAndCollectionSelectorAndResultSelector (source, collectionSelector, resultSelector); + + return source.Provider.Execute<IQueryable<TResult>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TCollection), typeof (TResult)), + source.Expression, + Expression.Quote (collectionSelector), + Expression.Quote (resultSelector))); } - - public static TSource Last<TSource> ( - this IQueryable<TSource> source, - Func<TSource, bool> predicate) + + public static IQueryable<TResult> SelectMany<TSource, TCollection, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, IEnumerable<TCollection>>> collectionSelector, Expression<Func<TSource, TCollection, TResult>> resultSelector) { - throw new NotImplementedException (); + Check.SourceAndCollectionSelectorAndResultSelector (source, collectionSelector, resultSelector); + + return source.Provider.Execute<IQueryable<TResult>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TCollection), typeof (TResult)), + source.Expression, + Expression.Quote (collectionSelector), + Expression.Quote (resultSelector))); } - - public static TSource LastOrDefault<TSource> (this IQueryable<TSource> source) + + #endregion + + #region SequenceEqual + + public static bool SequenceEqual<TSource> (this IQueryable<TSource> source1, IEnumerable<TSource> source2) { - throw new NotImplementedException (); + Check.Source1AndSource2 (source1, source2); + + return source1.Provider.Execute<bool> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source1.Expression, + Expression.Constant (source2))); } - - public static TSource LastOrDefault<TSource> ( - this IQueryable<TSource> source, - Func<TSource, bool> predicate) + + public static bool SequenceEqual<TSource> (this IQueryable<TSource> source1, IEnumerable<TSource> source2, IEqualityComparer<TSource> comparer) { - throw new NotImplementedException (); + Check.Source1AndSource2 (source1, source2); + + return source1.Provider.Execute<bool> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source1.Expression, + Expression.Constant (source2), + Expression.Constant (comparer))); } - + + #endregion + + #region Single + public static TSource Single<TSource> (this IQueryable<TSource> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression)); } - - public static TSource Single<TSource> ( - this IQueryable<TSource> source, - Func<TSource, bool> predicate) + + public static TSource Single<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) { - throw new NotImplementedException (); + Check.SourceAndPredicate (source, predicate); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (predicate))); } - + + #endregion + + #region SingleOrDefault + public static TSource SingleOrDefault<TSource> (this IQueryable<TSource> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression)); } - - public static TSource SingleOrDefault<TSource> ( - this IQueryable<TSource> source, - Func<TSource, bool> predicate) + + public static TSource SingleOrDefault<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) { - throw new NotImplementedException (); + Check.SourceAndPredicate (source, predicate); + + return source.Provider.Execute<TSource> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (predicate))); } - - public static TSource ElementAt<TSource> ( - this IQueryable<TSource> source, - int index) + + #endregion + + #region Skip + + public static IQueryable<TSource> Skip<TSource> (this IQueryable<TSource> source, int count) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Constant (count))); } - - public static TSource ElementAtOrDefault<TSource> ( - this IQueryable<TSource> source, - int index) + + #endregion + + #region SkipWhile + + public static IQueryable<TSource> SkipWhile<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) { - throw new NotImplementedException (); + Check.SourceAndPredicate (source, predicate); + + return source.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (predicate))); } - - public static IEnumerable<TSource> DefaultIfEmpty<TSource> ( - this IQueryable<TSource> source) + + public static IQueryable<TSource> SkipWhile<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, int, bool>> predicate) { - throw new NotImplementedException (); + Check.SourceAndPredicate (source, predicate); + + return source.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (predicate))); } - - public static IEnumerable<TSource> DefaultIfEmpty<TSource> ( - this IQueryable<TSource> source, - TSource defaultValue) + + + #endregion + + #region Sum + + + public static int Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, int>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<int> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - public static IEnumerable<TSource> Repeat<TSource> (this TSource element, int count) + public static int? Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, int?>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<int?> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - - private static List<TSource> ContainsGroup<K, TSource>( - Dictionary<K, List<TSource>> items, K key, IEqualityComparer<K> comparer) + + public static long Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, long>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<long> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - - public static IQueryable<IGrouping<K, TSource>> GroupBy<TSource, K> ( - this IQueryable<TSource> source, - Func<TSource, K> keySelector) + + public static long? Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, long?>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<long?> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - public static IQueryable<IGrouping<K, E>> GroupBy<TSource, K, E> ( - this IQueryable<TSource> source, - Func<TSource, K> keySelector, - Func<TSource, E> elementSelector) + public static float Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, float>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<float> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - - public static IEnumerable<IGrouping<K, E>> GroupBy<TSource, K, E> ( - this IQueryable<TSource> source, - Func<TSource, K> keySelector, - Func<TSource, E> elementSelector, - IEqualityComparer<K> comparer) + + public static float? Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, float?>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<float?> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - - public static IOrderedQueryable<TSource> OrderBy<TSource, TKey> ( - this IQueryable<TSource> source, - Func<TSource, TKey> keySelector) + + public static double Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, double>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<double> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - - public static IOrderedQueryable<TSource> OrderBy<TSource, TKey> ( - this IQueryable<TSource> source, - Func<TSource, TKey> keySelector, - IComparer<TKey> comparer) + + public static double? Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, double?>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<double?> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - - public static IOrderedQueryable<TSource> OrderByDescending<TSource, TKey> ( - this IQueryable<TSource> source, - Func<TSource, TKey> keySelector) + + public static decimal Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, decimal>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<decimal> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - - public static IOrderedQueryable<TSource> OrderByDescending<TSource, TKey> ( - this IQueryable<TSource> source, - Func<TSource, TKey> keySelector, - IComparer<TKey> comparer) + + public static decimal? Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, decimal?>> selector) { - throw new NotImplementedException (); + Check.SourceAndSelector (source, selector); + + return source.Provider.Execute<decimal?> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (selector))); } - public static IOrderedQueryable<TSource> ThenBy<TSource, TKey> ( - this IOrderedQueryable<TSource> source, - Func<TSource, TKey> keySelector) + public static int Sum (this IQueryable<int> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<int> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - - public static IOrderedQueryable<TSource> ThenBy<TSource, TKey> ( - this IOrderedQueryable<TSource> source, - Func<TSource, TKey> keySelector, - IComparer<TKey> comparer) + + public static int? Sum (this IQueryable<int?> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<int?> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - - public static IOrderedQueryable<TSource> ThenByDescending<TSource, TKey> ( - this IOrderedQueryable<TSource> source, - Func<TSource, TKey> keySelector) + + + + public static long Sum (this IQueryable<long> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<long> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - - public static IOrderedQueryable<TSource> ThenByDescending<TSource, TKey> ( - this IOrderedQueryable<TSource> source, - Func<TSource, TKey> keySelector, - IComparer<TKey> comparer) + + + + public static long? Sum (this IQueryable<long?> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<long?> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - public static IQueryable<TSource> Reverse<TSource> ( - this IQueryable<TSource> source) + public static float Sum (this IQueryable<float> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<float> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - - public static IEnumerable<TSource> Take<TSource> ( - this IQueryable<TSource> source, - int count) + + public static float? Sum (this IQueryable<float?> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<float?> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - - public static IEnumerable<TSource> Skip<TSource> ( - this IQueryable<TSource> source, - int count) + + + public static double Sum (this IQueryable<double> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<double> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - public static IEnumerable<TSource> TakeWhile<TSource> ( - this IQueryable<TSource> source, - Func<TSource, bool> predicate) + + + public static double? Sum (this IQueryable<double?> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<double?> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - - public static IEnumerable<TSource> TakeWhile<TSource> ( - this IQueryable<TSource> source, - Func<TSource, int, bool> predicate) + + + public static decimal Sum (this IQueryable<decimal> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<decimal> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - - public static IEnumerable<TSource> SkipWhile<TSource> ( - this IQueryable<TSource> source, - Func<TSource, bool> predicate) + + + + public static decimal? Sum (this IQueryable<decimal?> source) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<decimal?> ( + StaticCall ( + (MethodInfo) MethodBase.GetCurrentMethod (), + source.Expression)); } - - public static IEnumerable<TSource> SkipWhile<TSource> ( - this IQueryable<TSource> source, - Func<TSource, int, bool> predicate) + + + + #endregion + + #region Take + + public static IQueryable<TSource> Take<TSource> (this IQueryable<TSource> source, int count) { - throw new NotImplementedException (); + Check.Source (source); + + return source.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Constant (count))); } - - public static IEnumerable<TResult> Select<TSource, TResult> ( - this IQueryable<TSource> source, - Func<TSource, TResult> selector) + + #endregion + + #region TakeWhile + + public static IQueryable<TSource> TakeWhile<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) { - throw new NotImplementedException (); + Check.SourceAndPredicate (source, predicate); + + return source.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (predicate))); } - - public static IEnumerable<TResult> Select<TSource, TResult> ( - this IQueryable<TSource> source, - Func<TSource, int, TResult> selector) + + public static IQueryable<TSource> TakeWhile<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, int, bool>> predicate) { - throw new NotImplementedException (); + Check.SourceAndPredicate (source, predicate); + + return source.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (predicate))); } - - public static IEnumerable<TResult> SelectMany<TSource, TResult> ( - this IQueryable<TSource> source, - Func<TSource, IQueryable<TResult>> selector) + + #endregion + + #region ThenBy + + public static IOrderedQueryable<TSource> ThenBy<TSource, TKey> (this IOrderedQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector) { - throw new NotImplementedException (); + Check.SourceAndKeySelector (source, keySelector); + + return source.Provider.Execute<IOrderedQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)), + source.Expression, + Expression.Quote (keySelector))); } - - public static IEnumerable<TResult> SelectMany<TSource, TResult> ( - this IQueryable<TSource> source, - Func<TSource, int, IQueryable<TResult>> selector) + + public static IOrderedQueryable<TSource> ThenBy<TSource, TKey> (this IOrderedQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer) { - throw new NotImplementedException (); + Check.SourceAndKeySelector (source, keySelector); + + return source.Provider.Execute<IOrderedQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)), + source.Expression, + Expression.Quote (keySelector), + Expression.Constant (comparer))); } - - public static bool Any<TSource> (this IQueryable<TSource> source) + + #endregion + + #region ThenByDescending + + public static IOrderedQueryable<TSource> ThenByDescending<TSource, TKey> (this IOrderedQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector) { - throw new NotImplementedException (); + Check.SourceAndKeySelector (source, keySelector); + + return source.Provider.Execute<IOrderedQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)), + source.Expression, + Expression.Quote (keySelector))); } - - public static bool Any<TSource> ( - this IQueryable<TSource> source, - Func<TSource, bool> predicate) + + public static IOrderedQueryable<TSource> ThenByDescending<TSource, TKey> (this IOrderedQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer) { - throw new NotImplementedException (); + Check.SourceAndKeySelector (source, keySelector); + + return source.Provider.Execute<IOrderedQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)), + source.Expression, + Expression.Quote (keySelector), + Expression.Constant (comparer))); } - - public static bool All<TSource> ( - this IQueryable<TSource> source, - Func<TSource, bool> predicate) + + #endregion + + #region Union + + public static IEnumerable<TSource> Union<TSource> (this IQueryable<TSource> source1, IEnumerable<TSource> source2) { - throw new NotImplementedException (); + Check.Source1AndSource2 (source1, source2); + + return source1.Provider.Execute<IOrderedQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source1.Expression, + Expression.Constant (source2))); } - - public static bool Contains<TSource> (this IQueryable<TSource> source, TSource value) + + public static IEnumerable<TSource> Union<TSource> (this IQueryable<TSource> source1, IEnumerable<TSource> source2, IEqualityComparer<TSource> comparer) { - throw new NotImplementedException (); + Check.Source1AndSource2 (source1, source2); + + return source1.Provider.Execute<IOrderedQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source1.Expression, + Expression.Constant (source2), + Expression.Constant (comparer))); throw new NotImplementedException (); } - - public static IEnumerable<TSource> Where<TSource> ( - this IQueryable<TSource> source, - Func<TSource, bool> predicate) + + + #endregion + + #region Where + + public static IQueryable<TSource> Where<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) { - throw new NotImplementedException (); + Check.SourceAndPredicate (source, predicate); + + return source.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (predicate))); } - - public static IEnumerable<TSource> Where<TSource> ( - this IQueryable<TSource> source, - Func<TSource, int, bool> predicate) + + public static IQueryable<TSource> Where<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, int, bool>> predicate) { - throw new NotImplementedException (); - } - - public static IEnumerable<V> Join<TSource, U, K, V> ( - this IQueryable<TSource> outer, - IQueryable<U> inner, - Func<TSource, K> outerKeySelector, - Func<U, K> innerKeySelector, - Func<TSource, U, V> resultSelector) - { - throw new NotImplementedException (); + Check.SourceAndPredicate (source, predicate); + + return source.Provider.Execute<IQueryable<TSource>> ( + StaticCall ( + MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)), + source.Expression, + Expression.Quote (predicate))); } + + + #endregion + } } |