//------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // // [....] // [....] //------------------------------------------------------------------------------ using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Globalization; using System.Diagnostics; namespace System.Data { /// /// This static class defines the extension methods that add LINQ operator functionality /// within IEnumerableDT and IOrderedEnumerableDT. /// public static class EnumerableRowCollectionExtensions { /// /// LINQ's Where operator for generic EnumerableRowCollection. /// public static EnumerableRowCollection Where( this EnumerableRowCollection source, Func predicate) { EnumerableRowCollection edt = new EnumerableRowCollection(source, Enumerable.Where(source, predicate), null); //copy constructor edt.AddPredicate(predicate); return edt; } /// /// LINQ's OrderBy operator for generic EnumerableRowCollection. /// public static OrderedEnumerableRowCollection OrderBy( this EnumerableRowCollection source, Func keySelector) { IEnumerable ie = Enumerable.OrderBy(source, keySelector); OrderedEnumerableRowCollection edt = new OrderedEnumerableRowCollection(source, ie); edt.AddSortExpression(keySelector, false, true); return edt; } /// /// LINQ's OrderBy operator for generic EnumerableRowCollection. /// public static OrderedEnumerableRowCollection OrderBy( this EnumerableRowCollection source, Func keySelector, IComparer comparer) { IEnumerable ie = Enumerable.OrderBy(source, keySelector, comparer); OrderedEnumerableRowCollection edt = new OrderedEnumerableRowCollection(source, ie); edt.AddSortExpression(keySelector, comparer, false, true); return edt; } /// /// LINQ's OrderByDescending operator for generic EnumerableRowCollection. /// public static OrderedEnumerableRowCollection OrderByDescending( this EnumerableRowCollection source, Func keySelector) { IEnumerable ie = Enumerable.OrderByDescending(source, keySelector); OrderedEnumerableRowCollection edt = new OrderedEnumerableRowCollection(source, ie); edt.AddSortExpression(keySelector, true, true); return edt; } /// /// LINQ's OrderByDescending operator for generic EnumerableRowCollection. /// public static OrderedEnumerableRowCollection OrderByDescending( this EnumerableRowCollection source, Func keySelector, IComparer comparer) { IEnumerable ie = Enumerable.OrderByDescending(source, keySelector, comparer); OrderedEnumerableRowCollection edt = new OrderedEnumerableRowCollection(source, ie); edt.AddSortExpression(keySelector, comparer, true, true); return edt; } /// /// LINQ's ThenBy operator for generic EnumerableRowCollection. /// public static OrderedEnumerableRowCollection ThenBy( this OrderedEnumerableRowCollection source, Func keySelector) { IEnumerable ie = Enumerable.ThenBy((IOrderedEnumerable)source.EnumerableRows, keySelector); OrderedEnumerableRowCollection edt = new OrderedEnumerableRowCollection((EnumerableRowCollection)source, ie); edt.AddSortExpression(keySelector, /*isDesc*/ false, /*isOrderBy*/ false); return edt; } /// /// LINQ's ThenBy operator for generic EnumerableRowCollection. /// public static OrderedEnumerableRowCollection ThenBy( this OrderedEnumerableRowCollection source, Func keySelector, IComparer comparer) { IEnumerable ie = Enumerable.ThenBy((IOrderedEnumerable)source.EnumerableRows, keySelector, comparer); OrderedEnumerableRowCollection edt = new OrderedEnumerableRowCollection((EnumerableRowCollection)source, ie); edt.AddSortExpression(keySelector, comparer, false, false); return edt; } /// /// LINQ's ThenByDescending operator for generic EnumerableRowCollection. /// public static OrderedEnumerableRowCollection ThenByDescending( this OrderedEnumerableRowCollection source, Func keySelector) { IEnumerable ie = Enumerable.ThenByDescending((IOrderedEnumerable)source.EnumerableRows, keySelector); OrderedEnumerableRowCollection edt = new OrderedEnumerableRowCollection((EnumerableRowCollection)source, ie); edt.AddSortExpression(keySelector, /*desc*/ true, false); return edt; } /// /// LINQ's ThenByDescending operator for generic EnumerableRowCollection. /// public static OrderedEnumerableRowCollection ThenByDescending( this OrderedEnumerableRowCollection source, Func keySelector, IComparer comparer) { IEnumerable ie = Enumerable.ThenByDescending((IOrderedEnumerable)source.EnumerableRows, keySelector, comparer); OrderedEnumerableRowCollection edt = new OrderedEnumerableRowCollection((EnumerableRowCollection)source, ie); edt.AddSortExpression(keySelector, comparer, true, false); return edt; } /// /// Executes a Select (Projection) on EnumerableDataTable. If the selector returns a different /// type than the type of rows, then AsLinqDataView is disabled, and the returning EnumerableDataTable /// represents an enumerable over the LINQ Query. /// public static EnumerableRowCollection Select( this EnumerableRowCollection source, Func selector) { //Anonymous type or some other type //The only thing that matters from this point on is _enumerableRows IEnumerable typedEnumerable = Enumerable.Select(source, selector); // Dont need predicates or sort expression from this point on since we know // AsLinqDataView is disabled. return new EnumerableRowCollection(((object)source) as EnumerableRowCollection, typedEnumerable, ((object)selector) as Func); } /// /// Casts an EnumerableDataTable_TSource into EnumerableDataTable_TResult /// public static EnumerableRowCollection Cast(this EnumerableRowCollection source) { // Since Cast does not have the signature Cast_T_R(..) this call is routed // through the non-generic base class EnumerableDataTable if ((null != source) && source.ElementType.Equals(typeof(TResult))) { return (EnumerableRowCollection)(object)source; } else { //Anonymous type or some other type //The only thing that matters from this point on is _enumerableRows IEnumerable typedEnumerable = Enumerable.Cast(source); EnumerableRowCollection newEdt = new EnumerableRowCollection( typedEnumerable, typeof(TResult).IsAssignableFrom(source.ElementType) && typeof(DataRow).IsAssignableFrom(typeof(TResult)), source.Table); return newEdt; } } } //end class }