PageRenderTime 50ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/mcs/class/System.Core/System.Linq/Queryable.cs

https://bitbucket.org/steenlund/mono-2.6.7-for-amiga
C# | 1608 lines | 1228 code | 350 blank | 30 comment | 29 complexity | 70b87b3acce31097de68412fd6881b9f MD5 | raw file
Possible License(s): LGPL-2.0, MPL-2.0-no-copyleft-exception, CC-BY-SA-3.0, GPL-2.0, LGPL-2.1

Large files files are truncated, but you can click here to view the full file

  1. //
  2. // Queryable.cs
  3. //
  4. // Authors:
  5. // Marek Safar (marek.safar@gmail.com)
  6. // Alejandro Serrano "Serras" (trupill@yahoo.es)
  7. // Jb Evain (jbevain@novell.com)
  8. // Andreas Noever (andreas.noever@gmail.com)
  9. //
  10. // Copyright (C) 2008 Novell, Inc (http://www.novell.com)
  11. //
  12. // Permission is hereby granted, free of charge, to any person obtaining
  13. // a copy of this software and associated documentation files (the
  14. // "Software"), to deal in the Software without restriction, including
  15. // without limitation the rights to use, copy, modify, merge, publish,
  16. // distribute, sublicense, and/or sell copies of the Software, and to
  17. // permit persons to whom the Software is furnished to do so, subject to
  18. // the following conditions:
  19. //
  20. // The above copyright notice and this permission notice shall be
  21. // included in all copies or substantial portions of the Software.
  22. //
  23. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  27. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  28. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  29. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  30. //
  31. using System;
  32. using System.Collections;
  33. using System.Collections.Generic;
  34. using System.Linq.Expressions;
  35. using System.Reflection;
  36. using System.Linq;
  37. namespace System.Linq {
  38. public static class Queryable {
  39. static MethodInfo MakeGeneric (MethodBase method, params Type [] parameters)
  40. {
  41. return ((MethodInfo) method).MakeGenericMethod (parameters);
  42. }
  43. static Expression StaticCall (MethodInfo method, params Expression [] expressions)
  44. {
  45. return Expression.Call (null, method, expressions);
  46. }
  47. static TRet Execute<TRet, TSource> (this IQueryable<TSource> source, MethodBase current)
  48. {
  49. return source.Provider.Execute<TRet> (
  50. StaticCall (
  51. MakeGeneric (current, typeof (TSource)),
  52. source.Expression));
  53. }
  54. #region Aggregate
  55. public static TSource Aggregate<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, TSource, TSource>> func)
  56. {
  57. Check.SourceAndFunc (source, func);
  58. return source.Provider.Execute<TSource> (
  59. StaticCall (
  60. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  61. source.Expression,
  62. Expression.Quote (func)));
  63. }
  64. public static TAccumulate Aggregate<TSource, TAccumulate> (this IQueryable<TSource> source, TAccumulate seed, Expression<Func<TAccumulate, TSource, TAccumulate>> func)
  65. {
  66. Check.SourceAndFunc (source, func);
  67. return source.Provider.Execute<TAccumulate> (
  68. StaticCall (
  69. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TAccumulate)),
  70. source.Expression,
  71. Expression.Constant (seed, typeof (TAccumulate)),
  72. Expression.Quote (func)));
  73. }
  74. public static TResult Aggregate<TSource, TAccumulate, TResult> (this IQueryable<TSource> source, TAccumulate seed, Expression<Func<TAccumulate, TSource, TAccumulate>> func, Expression<Func<TAccumulate, TResult>> selector)
  75. {
  76. Check.SourceAndFuncAndSelector (source, func, selector);
  77. return source.Provider.Execute<TResult> (
  78. StaticCall (
  79. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TAccumulate), typeof (TResult)),
  80. source.Expression,
  81. Expression.Constant (seed, typeof (TAccumulate)),
  82. Expression.Quote (func),
  83. Expression.Quote (selector)));
  84. }
  85. #endregion
  86. #region All
  87. public static bool All<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
  88. {
  89. Check.SourceAndPredicate (source, predicate);
  90. return source.Provider.Execute<bool> (
  91. StaticCall (
  92. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  93. source.Expression,
  94. Expression.Quote (predicate)));
  95. }
  96. #endregion
  97. #region Any
  98. public static bool Any<TSource> (this IQueryable<TSource> source)
  99. {
  100. Check.Source (source);
  101. return source.Provider.Execute<bool> (
  102. StaticCall (
  103. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  104. source.Expression));
  105. }
  106. public static bool Any<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
  107. {
  108. Check.SourceAndPredicate (source, predicate);
  109. return source.Provider.Execute<bool> (
  110. StaticCall (
  111. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  112. source.Expression,
  113. Expression.Quote (predicate)));
  114. }
  115. #endregion
  116. #region AsQueryable
  117. public static IQueryable<TElement> AsQueryable<TElement> (this IEnumerable<TElement> source)
  118. {
  119. if (source == null)
  120. throw new ArgumentNullException ("source");
  121. var queryable = source as IQueryable<TElement>;
  122. if (queryable != null)
  123. return queryable;
  124. return new QueryableEnumerable<TElement> (source);
  125. }
  126. public static IQueryable AsQueryable (this IEnumerable source)
  127. {
  128. if (source == null)
  129. throw new ArgumentNullException ("source");
  130. var queryable = source as IQueryable;
  131. if (queryable != null)
  132. return queryable;
  133. var type = source.GetType ();
  134. if (!type.IsGenericImplementationOf (typeof (IEnumerable<>)))
  135. throw new ArgumentException ("source is not IEnumerable<>");
  136. return (IQueryable) Activator.CreateInstance (
  137. typeof (QueryableEnumerable<>).MakeGenericType (type.GetFirstGenericArgument ()), source);
  138. }
  139. #endregion
  140. #region Average
  141. public static double Average (this IQueryable<int> source)
  142. {
  143. Check.Source (source);
  144. return source.Provider.Execute<double>(
  145. StaticCall (
  146. (MethodInfo) MethodBase.GetCurrentMethod (),
  147. source.Expression));
  148. }
  149. public static double? Average(this IQueryable<int?> source)
  150. {
  151. Check.Source (source);
  152. return source.Provider.Execute<double?>(
  153. StaticCall (
  154. (MethodInfo) MethodBase.GetCurrentMethod (),
  155. source.Expression));
  156. }
  157. public static double Average(this IQueryable<long> source)
  158. {
  159. Check.Source (source);
  160. return source.Provider.Execute<double>(
  161. StaticCall (
  162. (MethodInfo) MethodBase.GetCurrentMethod (),
  163. source.Expression));
  164. }
  165. public static double? Average(this IQueryable<long?> source)
  166. {
  167. Check.Source (source);
  168. return source.Provider.Execute<double?>(
  169. StaticCall (
  170. (MethodInfo) MethodBase.GetCurrentMethod (),
  171. source.Expression));
  172. }
  173. public static float Average(this IQueryable<float> source)
  174. {
  175. Check.Source (source);
  176. return source.Provider.Execute<float>(
  177. StaticCall (
  178. (MethodInfo) MethodBase.GetCurrentMethod (),
  179. source.Expression));
  180. }
  181. public static float? Average(this IQueryable<float?> source)
  182. {
  183. Check.Source (source);
  184. return source.Provider.Execute<float?>(
  185. StaticCall (
  186. (MethodInfo) MethodBase.GetCurrentMethod (),
  187. source.Expression));
  188. }
  189. public static double Average (this IQueryable<double> source)
  190. {
  191. Check.Source (source);
  192. return source.Provider.Execute<double> (
  193. StaticCall (
  194. (MethodInfo) MethodBase.GetCurrentMethod (),
  195. source.Expression));
  196. }
  197. public static double? Average (this IQueryable<double?> source)
  198. {
  199. Check.Source (source);
  200. return source.Provider.Execute<double?> (
  201. StaticCall (
  202. (MethodInfo) MethodBase.GetCurrentMethod (),
  203. source.Expression));
  204. }
  205. public static decimal Average(this IQueryable<decimal> source)
  206. {
  207. Check.Source (source);
  208. return source.Provider.Execute<decimal>(
  209. StaticCall (
  210. (MethodInfo) MethodBase.GetCurrentMethod (),
  211. source.Expression));
  212. }
  213. public static decimal? Average(this IQueryable<decimal?> source)
  214. {
  215. Check.Source (source);
  216. return source.Provider.Execute<decimal?>(
  217. StaticCall (
  218. (MethodInfo) MethodBase.GetCurrentMethod (),
  219. source.Expression));
  220. }
  221. public static double Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, int>> selector)
  222. {
  223. Check.SourceAndSelector (source, selector);
  224. return source.Provider.Execute<double>(
  225. StaticCall (
  226. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  227. source.Expression,
  228. Expression.Quote (selector)));
  229. }
  230. public static double? Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, int?>> selector)
  231. {
  232. Check.SourceAndSelector (source, selector);
  233. return source.Provider.Execute<double?>(
  234. StaticCall (
  235. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  236. source.Expression,
  237. Expression.Quote (selector)));
  238. }
  239. public static double Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, long>> selector)
  240. {
  241. Check.SourceAndSelector (source, selector);
  242. return source.Provider.Execute<double>(
  243. StaticCall (
  244. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  245. source.Expression,
  246. Expression.Quote (selector)));
  247. }
  248. public static double? Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, long?>> selector)
  249. {
  250. Check.SourceAndSelector (source, selector);
  251. return source.Provider.Execute<double?>(
  252. StaticCall (
  253. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  254. source.Expression,
  255. Expression.Quote (selector)));
  256. }
  257. public static float Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, float>> selector)
  258. {
  259. Check.SourceAndSelector (source, selector);
  260. return source.Provider.Execute<float>(
  261. StaticCall (
  262. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  263. source.Expression,
  264. Expression.Quote (selector)));
  265. }
  266. public static float? Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, float?>> selector)
  267. {
  268. Check.SourceAndSelector (source, selector);
  269. return source.Provider.Execute<float?>(
  270. StaticCall (
  271. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  272. source.Expression,
  273. Expression.Quote (selector)));
  274. }
  275. public static double Average<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, double>> selector)
  276. {
  277. Check.SourceAndSelector (source, selector);
  278. return source.Provider.Execute<double> (
  279. StaticCall (
  280. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  281. source.Expression,
  282. Expression.Quote (selector)));
  283. }
  284. public static double? Average<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, double?>> selector)
  285. {
  286. Check.SourceAndSelector (source, selector);
  287. return source.Provider.Execute<double?> (
  288. StaticCall (
  289. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  290. source.Expression,
  291. Expression.Quote (selector)));
  292. }
  293. public static decimal Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, decimal>> selector)
  294. {
  295. Check.SourceAndSelector (source, selector);
  296. return source.Provider.Execute<decimal>(
  297. StaticCall (
  298. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  299. source.Expression,
  300. Expression.Quote (selector)));
  301. }
  302. public static decimal? Average<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, decimal?>> selector)
  303. {
  304. Check.SourceAndSelector (source, selector);
  305. return source.Provider.Execute<decimal?>(
  306. StaticCall (
  307. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  308. source.Expression,
  309. Expression.Quote (selector)));
  310. }
  311. #endregion
  312. #region Cast
  313. public static IQueryable<TResult> Cast<TResult> (this IQueryable source)
  314. {
  315. Check.Source (source);
  316. return (IQueryable<TResult>) source.Provider.CreateQuery (
  317. StaticCall (MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TResult)),
  318. source.Expression));
  319. }
  320. #endregion
  321. #region Concat
  322. public static IQueryable<TSource> Concat<TSource> (this IQueryable<TSource> source1, IEnumerable<TSource> source2)
  323. {
  324. Check.Source1AndSource2 (source1, source2);
  325. return source1.Provider.CreateQuery<TSource> (
  326. StaticCall (
  327. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  328. source1.Expression,
  329. Expression.Constant (source2, typeof (IEnumerable<TSource>))));
  330. }
  331. #endregion
  332. #region Contains
  333. public static bool Contains<TSource> (this IQueryable<TSource> source, TSource item)
  334. {
  335. Check.Source (source);
  336. return source.Provider.Execute<bool> (
  337. StaticCall (
  338. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  339. source.Expression,
  340. Expression.Constant (item, typeof (TSource))));
  341. }
  342. public static bool Contains<TSource> (this IQueryable<TSource> source, TSource item, IEqualityComparer<TSource> comparer)
  343. {
  344. Check.Source (source);
  345. return source.Provider.Execute<bool> (
  346. StaticCall (
  347. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  348. source.Expression,
  349. Expression.Constant (item, typeof (TSource)),
  350. Expression.Constant (comparer, typeof (IEqualityComparer<TSource>))));
  351. }
  352. #endregion
  353. #region Count
  354. public static int Count<TSource> (this IQueryable<TSource> source)
  355. {
  356. Check.Source (source);
  357. return source.Execute<int, TSource> (MethodBase.GetCurrentMethod ());
  358. }
  359. public static int Count<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
  360. {
  361. Check.SourceAndPredicate (source, predicate);
  362. return source.Provider.Execute<int> (
  363. StaticCall (
  364. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  365. source.Expression,
  366. Expression.Quote (predicate)));
  367. }
  368. #endregion
  369. #region DefaultIfEmpty
  370. public static IQueryable<TSource> DefaultIfEmpty<TSource> (this IQueryable<TSource> source)
  371. {
  372. Check.Source (source);
  373. return source.Provider.CreateQuery<TSource> (
  374. StaticCall (
  375. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  376. source.Expression));
  377. }
  378. public static IQueryable<TSource> DefaultIfEmpty<TSource> (this IQueryable<TSource> source, TSource defaultValue)
  379. {
  380. Check.Source (source);
  381. return source.Provider.CreateQuery<TSource> (
  382. StaticCall (
  383. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  384. source.Expression,
  385. Expression.Constant (defaultValue, typeof (TSource))));
  386. }
  387. #endregion
  388. #region Distinct
  389. public static IQueryable<TSource> Distinct<TSource> (this IQueryable<TSource> source)
  390. {
  391. Check.Source (source);
  392. return source.Provider.CreateQuery<TSource> (
  393. StaticCall (
  394. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  395. source.Expression));
  396. }
  397. public static IQueryable<TSource> Distinct<TSource> (this IQueryable<TSource> source, IEqualityComparer<TSource> comparer)
  398. {
  399. Check.Source (source);
  400. return source.Provider.CreateQuery<TSource> (
  401. StaticCall (
  402. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  403. source.Expression,
  404. Expression.Constant (comparer, typeof (IEqualityComparer<TSource>))));
  405. }
  406. #endregion
  407. #region ElementAt
  408. public static TSource ElementAt<TSource> (this IQueryable<TSource> source, int index)
  409. {
  410. Check.Source (source);
  411. return source.Provider.Execute<TSource> (
  412. StaticCall (
  413. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  414. source.Expression,
  415. Expression.Constant (index)));
  416. }
  417. #endregion
  418. #region ElementAtOrDefault
  419. public static TSource ElementAtOrDefault<TSource> (this IQueryable<TSource> source, int index)
  420. {
  421. Check.Source (source);
  422. return source.Provider.Execute<TSource> (
  423. StaticCall (
  424. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  425. source.Expression,
  426. Expression.Constant (index)));
  427. }
  428. #endregion
  429. #region Except
  430. public static IQueryable<TSource> Except<TSource> (this IQueryable<TSource> source1, IEnumerable<TSource> source2)
  431. {
  432. Check.Source1AndSource2 (source1, source2);
  433. return source1.Provider.CreateQuery<TSource> (
  434. StaticCall (
  435. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  436. source1.Expression,
  437. Expression.Constant (source2, typeof (IEnumerable<TSource>))));
  438. }
  439. public static IQueryable<TSource> Except<TSource> (this IQueryable<TSource> source1, IEnumerable<TSource> source2, IEqualityComparer<TSource> comparer)
  440. {
  441. Check.Source1AndSource2 (source1, source2);
  442. return source1.Provider.CreateQuery<TSource> (
  443. StaticCall (
  444. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  445. source1.Expression,
  446. Expression.Constant (source2, typeof (IEnumerable<TSource>)),
  447. Expression.Constant (comparer, typeof (IEqualityComparer<TSource>))));
  448. }
  449. #endregion
  450. #region First
  451. public static TSource First<TSource> (this IQueryable<TSource> source)
  452. {
  453. Check.Source (source);
  454. return source.Provider.Execute<TSource> (
  455. StaticCall (
  456. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  457. source.Expression));
  458. }
  459. public static TSource First<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
  460. {
  461. Check.SourceAndPredicate (source, predicate);
  462. return source.Provider.Execute<TSource> (
  463. StaticCall (
  464. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  465. source.Expression,
  466. Expression.Quote (predicate)));
  467. }
  468. #endregion
  469. #region FirstOrDefault
  470. public static TSource FirstOrDefault<TSource> (this IQueryable<TSource> source)
  471. {
  472. Check.Source (source);
  473. return source.Provider.Execute<TSource> (
  474. StaticCall (
  475. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  476. source.Expression));
  477. }
  478. public static TSource FirstOrDefault<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
  479. {
  480. Check.SourceAndPredicate (source, predicate);
  481. return source.Provider.Execute<TSource> (
  482. StaticCall (
  483. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  484. source.Expression,
  485. Expression.Quote (predicate)));
  486. }
  487. #endregion
  488. #region GroupBy
  489. public static IQueryable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector)
  490. {
  491. Check.SourceAndKeySelector (source, keySelector);
  492. return source.Provider.CreateQuery<IGrouping<TKey, TSource>> (
  493. StaticCall (
  494. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)),
  495. source.Expression,
  496. Expression.Quote (keySelector)));
  497. }
  498. public static IQueryable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IEqualityComparer<TKey> comparer)
  499. {
  500. Check.SourceAndKeySelector (source, keySelector);
  501. return source.Provider.CreateQuery<IGrouping<TKey, TSource>> (
  502. StaticCall (
  503. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)),
  504. source.Expression,
  505. Expression.Quote (keySelector),
  506. Expression.Constant (comparer, typeof (IEqualityComparer<TKey>))));
  507. }
  508. public static IQueryable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TSource, TElement>> elementSelector)
  509. {
  510. Check.SourceAndKeyElementSelectors (source, keySelector, elementSelector);
  511. return source.Provider.CreateQuery<IGrouping<TKey, TElement>>(
  512. StaticCall (
  513. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey), typeof (TElement)),
  514. source.Expression,
  515. Expression.Quote (keySelector),
  516. Expression.Quote (elementSelector)));
  517. }
  518. public static IQueryable<TResult> GroupBy<TSource, TKey, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, Expression<Func<TKey, IEnumerable<TSource>, TResult>> resultSelector)
  519. {
  520. Check.SourceAndKeyResultSelectors (source, keySelector, resultSelector);
  521. return source.Provider.CreateQuery<TResult> (
  522. StaticCall (
  523. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey), typeof (TResult)),
  524. source.Expression,
  525. Expression.Quote (keySelector),
  526. Expression.Quote (resultSelector)));
  527. }
  528. 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)
  529. {
  530. Check.SourceAndKeyElementSelectors (source, keySelector, elementSelector);
  531. return source.Provider.CreateQuery<IGrouping<TKey, TElement>> (
  532. StaticCall (
  533. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey), typeof (TElement)),
  534. source.Expression,
  535. Expression.Quote (keySelector),
  536. Expression.Quote (elementSelector),
  537. Expression.Constant (comparer, typeof (IEqualityComparer<TKey>))));
  538. }
  539. 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)
  540. {
  541. Check.GroupBySelectors (source, keySelector, elementSelector, resultSelector);
  542. return source.Provider.CreateQuery<TResult> (
  543. StaticCall (
  544. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey), typeof (TElement), typeof (TResult)),
  545. source.Expression,
  546. Expression.Quote (keySelector),
  547. Expression.Quote (elementSelector),
  548. Expression.Quote (resultSelector)));
  549. }
  550. 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)
  551. {
  552. Check.SourceAndKeyResultSelectors (source, keySelector, resultSelector);
  553. return source.Provider.CreateQuery<TResult> (
  554. StaticCall (
  555. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey), typeof (TResult)),
  556. source.Expression,
  557. Expression.Quote (keySelector),
  558. Expression.Quote (resultSelector),
  559. Expression.Constant (comparer, typeof (IEqualityComparer<TKey>))));
  560. }
  561. 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)
  562. {
  563. Check.GroupBySelectors (source, keySelector, elementSelector, resultSelector);
  564. return source.Provider.CreateQuery<TResult> (
  565. StaticCall (
  566. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey), typeof (TElement), typeof (TResult)),
  567. source.Expression,
  568. Expression.Quote (keySelector),
  569. Expression.Quote (elementSelector),
  570. Expression.Quote (resultSelector),
  571. Expression.Constant (comparer, typeof (IEqualityComparer<TKey>))));
  572. }
  573. #endregion
  574. #region GroupJoin
  575. 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)
  576. {
  577. if (outer == null)
  578. throw new ArgumentNullException ("outer");
  579. if (inner == null)
  580. throw new ArgumentNullException ("inner");
  581. if (outerKeySelector == null)
  582. throw new ArgumentNullException ("outerKeySelector");
  583. if (innerKeySelector == null)
  584. throw new ArgumentNullException ("innerKeySelector");
  585. if (resultSelector == null)
  586. throw new ArgumentNullException ("resultSelector");
  587. return outer.Provider.CreateQuery<TResult> (
  588. StaticCall (
  589. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TOuter), typeof (TInner), typeof (TKey), typeof (TResult)),
  590. outer.Expression,
  591. Expression.Constant (inner, typeof (IEnumerable<TInner>)),
  592. Expression.Quote (outerKeySelector),
  593. Expression.Quote (innerKeySelector),
  594. Expression.Quote (resultSelector)));
  595. }
  596. 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)
  597. {
  598. if (outer == null)
  599. throw new ArgumentNullException ("outer");
  600. if (inner == null)
  601. throw new ArgumentNullException ("inner");
  602. if (outerKeySelector == null)
  603. throw new ArgumentNullException ("outerKeySelector");
  604. if (innerKeySelector == null)
  605. throw new ArgumentNullException ("innerKeySelector");
  606. if (resultSelector == null)
  607. throw new ArgumentNullException ("resultSelector");
  608. return outer.Provider.CreateQuery<TResult> (
  609. StaticCall (
  610. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TOuter), typeof (TInner), typeof (TKey), typeof (TResult)),
  611. outer.Expression,
  612. Expression.Constant (inner, typeof (IEnumerable<TInner>)),
  613. Expression.Quote (outerKeySelector),
  614. Expression.Quote (innerKeySelector),
  615. Expression.Quote (resultSelector),
  616. Expression.Constant (comparer)));
  617. }
  618. #endregion
  619. #region Intersect
  620. public static IQueryable<TSource> Intersect<TSource> (this IQueryable<TSource> source1, IEnumerable<TSource> source2)
  621. {
  622. Check.Source1AndSource2 (source1, source2);
  623. return source1.Provider.CreateQuery<TSource> (
  624. StaticCall (
  625. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  626. source1.Expression,
  627. Expression.Constant (source2, typeof (IEnumerable<TSource>))));
  628. }
  629. public static IQueryable<TSource> Intersect<TSource> (this IQueryable<TSource> source1, IEnumerable<TSource> source2, IEqualityComparer<TSource> comparer)
  630. {
  631. Check.Source1AndSource2 (source1, source2);
  632. return source1.Provider.CreateQuery<TSource> (
  633. StaticCall (
  634. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  635. source1.Expression,
  636. Expression.Constant (source2, typeof (IEnumerable<TSource>)),
  637. Expression.Constant (comparer, typeof (IEqualityComparer<TSource>))));
  638. }
  639. #endregion
  640. #region Join
  641. 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)
  642. {
  643. Check.JoinSelectors (outer, inner, outerKeySelector, innerKeySelector, resultSelector);
  644. return outer.Provider.CreateQuery<TResult> (
  645. StaticCall (
  646. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TOuter), typeof (TInner), typeof (TKey), typeof (TResult)),
  647. outer.Expression,
  648. Expression.Constant (inner, typeof (IEnumerable<TInner>)),
  649. Expression.Quote (outerKeySelector),
  650. Expression.Quote (innerKeySelector),
  651. Expression.Quote (resultSelector)));
  652. }
  653. 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)
  654. {
  655. Check.JoinSelectors (outer, inner, outerKeySelector, innerKeySelector, resultSelector);
  656. return outer.Provider.CreateQuery<TResult> (
  657. StaticCall (
  658. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TOuter), typeof (TInner), typeof (TKey), typeof (TResult)),
  659. outer.Expression,
  660. Expression.Constant (inner, typeof (IEnumerable<TInner>)),
  661. Expression.Quote (outerKeySelector),
  662. Expression.Quote (innerKeySelector),
  663. Expression.Quote (resultSelector),
  664. Expression.Constant (comparer, typeof (IEqualityComparer<TKey>))));
  665. }
  666. #endregion
  667. #region Last
  668. public static TSource Last<TSource> (this IQueryable<TSource> source)
  669. {
  670. Check.Source (source);
  671. return source.Provider.Execute<TSource> (
  672. StaticCall (
  673. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  674. source.Expression));
  675. }
  676. public static TSource Last<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
  677. {
  678. Check.SourceAndPredicate (source, predicate);
  679. return source.Provider.Execute<TSource> (
  680. StaticCall (
  681. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  682. source.Expression,
  683. Expression.Quote (predicate)));
  684. }
  685. #endregion
  686. #region LastOrDefault
  687. public static TSource LastOrDefault<TSource> (this IQueryable<TSource> source)
  688. {
  689. Check.Source (source);
  690. return source.Provider.Execute<TSource> (
  691. StaticCall (
  692. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  693. source.Expression));
  694. }
  695. public static TSource LastOrDefault<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
  696. {
  697. Check.SourceAndPredicate (source, predicate);
  698. return source.Provider.Execute<TSource> (
  699. StaticCall (
  700. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  701. source.Expression,
  702. Expression.Quote (predicate)));
  703. }
  704. #endregion
  705. #region LongCount
  706. public static long LongCount<TSource> (this IQueryable<TSource> source)
  707. {
  708. Check.Source (source);
  709. return source.Execute<long, TSource> (MethodBase.GetCurrentMethod ());
  710. }
  711. public static long LongCount<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
  712. {
  713. Check.SourceAndPredicate (source, predicate);
  714. return source.Provider.Execute<long> (
  715. StaticCall (
  716. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  717. source.Expression,
  718. Expression.Quote (predicate)));
  719. }
  720. #endregion
  721. #region Max
  722. public static TSource Max<TSource> (this IQueryable<TSource> source)
  723. {
  724. Check.Source (source);
  725. return source.Provider.Execute<TSource> (
  726. StaticCall (
  727. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  728. source.Expression));
  729. }
  730. public static TResult Max<TSource, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector)
  731. {
  732. Check.Source (source);
  733. return source.Provider.Execute<TResult> (
  734. StaticCall (
  735. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TResult)),
  736. source.Expression,
  737. Expression.Quote (selector)));
  738. }
  739. #endregion
  740. #region Min
  741. public static TSource Min<TSource> (this IQueryable<TSource> source)
  742. {
  743. Check.Source (source);
  744. return source.Provider.Execute<TSource> (
  745. StaticCall (
  746. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  747. source.Expression));
  748. }
  749. public static TResult Min<TSource, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector)
  750. {
  751. Check.SourceAndSelector (source, selector);
  752. return source.Provider.Execute<TResult> (
  753. StaticCall (
  754. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TResult)),
  755. source.Expression,
  756. Expression.Quote (selector)));
  757. }
  758. #endregion
  759. #region OfType
  760. public static IQueryable<TResult> OfType<TResult> (this IQueryable source)
  761. {
  762. Check.Source (source);
  763. return (IQueryable<TResult>) source.Provider.CreateQuery (
  764. StaticCall (
  765. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TResult)),
  766. source.Expression));
  767. }
  768. #endregion
  769. #region OrderBy
  770. public static IOrderedQueryable<TSource> OrderBy<TSource, TKey> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector)
  771. {
  772. Check.SourceAndKeySelector (source, keySelector);
  773. return (IOrderedQueryable<TSource>) source.Provider.CreateQuery<TSource> (
  774. StaticCall (
  775. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)),
  776. source.Expression,
  777. Expression.Quote (keySelector)));
  778. }
  779. public static IOrderedQueryable<TSource> OrderBy<TSource, TKey> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer)
  780. {
  781. Check.SourceAndKeySelector (source, keySelector);
  782. return (IOrderedQueryable<TSource>) source.Provider.CreateQuery<TSource> (
  783. StaticCall (
  784. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)),
  785. source.Expression,
  786. Expression.Quote (keySelector),
  787. Expression.Constant (comparer, typeof (IComparer<TKey>))));
  788. }
  789. #endregion
  790. #region OrderByDescending
  791. public static IOrderedQueryable<TSource> OrderByDescending<TSource, TKey> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector)
  792. {
  793. Check.SourceAndKeySelector (source, keySelector);
  794. return (IOrderedQueryable<TSource>) source.Provider.CreateQuery<TSource> (
  795. StaticCall (
  796. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)),
  797. source.Expression,
  798. Expression.Quote (keySelector)));
  799. }
  800. public static IOrderedQueryable<TSource> OrderByDescending<TSource, TKey> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer)
  801. {
  802. Check.SourceAndKeySelector (source, keySelector);
  803. return (IOrderedQueryable<TSource>) source.Provider.CreateQuery<TSource> (
  804. StaticCall (
  805. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)),
  806. source.Expression,
  807. Expression.Quote (keySelector),
  808. Expression.Constant (comparer, typeof (IComparer<TKey>))));
  809. }
  810. #endregion
  811. #region Reverse
  812. public static IQueryable<TSource> Reverse<TSource> (this IQueryable<TSource> source)
  813. {
  814. Check.Source (source);
  815. return source.Provider.CreateQuery<TSource> (
  816. StaticCall (
  817. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  818. source.Expression));
  819. }
  820. #endregion
  821. #region Select
  822. public static IQueryable<TResult> Select<TSource, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, TResult>> selector)
  823. {
  824. Check.SourceAndSelector (source, selector);
  825. return source.Provider.CreateQuery<TResult> (
  826. StaticCall (
  827. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TResult)),
  828. source.Expression,
  829. Expression.Quote (selector)));
  830. }
  831. public static IQueryable<TResult> Select<TSource, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, int, TResult>> selector)
  832. {
  833. Check.SourceAndSelector (source, selector);
  834. return source.Provider.CreateQuery<TResult> (
  835. StaticCall (
  836. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TResult)),
  837. source.Expression,
  838. Expression.Quote (selector)));
  839. }
  840. #endregion
  841. #region SelectMany
  842. public static IQueryable<TResult> SelectMany<TSource, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, IEnumerable<TResult>>> selector)
  843. {
  844. Check.SourceAndSelector (source, selector);
  845. return source.Provider.CreateQuery<TResult> (
  846. StaticCall (
  847. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TResult)),
  848. source.Expression,
  849. Expression.Quote (selector)));
  850. }
  851. public static IQueryable<TResult> SelectMany<TSource, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, int, IEnumerable<TResult>>> selector)
  852. {
  853. Check.SourceAndSelector (source, selector);
  854. return source.Provider.CreateQuery<TResult> (
  855. StaticCall (
  856. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TResult)),
  857. source.Expression,
  858. Expression.Quote (selector)));
  859. }
  860. 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)
  861. {
  862. Check.SourceAndCollectionSelectorAndResultSelector (source, collectionSelector, resultSelector);
  863. return source.Provider.CreateQuery<TResult> (
  864. StaticCall (
  865. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TCollection), typeof (TResult)),
  866. source.Expression,
  867. Expression.Quote (collectionSelector),
  868. Expression.Quote (resultSelector)));
  869. }
  870. public static IQueryable<TResult> SelectMany<TSource, TCollection, TResult> (this IQueryable<TSource> source, Expression<Func<TSource, IEnumerable<TCollection>>> collectionSelector, Expression<Func<TSource, TCollection, TResult>> resultSelector)
  871. {
  872. Check.SourceAndCollectionSelectorAndResultSelector (source, collectionSelector, resultSelector);
  873. return source.Provider.CreateQuery<TResult> (
  874. StaticCall (
  875. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TCollection), typeof (TResult)),
  876. source.Expression,
  877. Expression.Quote (collectionSelector),
  878. Expression.Quote (resultSelector)));
  879. }
  880. #endregion
  881. #region SequenceEqual
  882. public static bool SequenceEqual<TSource> (this IQueryable<TSource> source1, IEnumerable<TSource> source2)
  883. {
  884. Check.Source1AndSource2 (source1, source2);
  885. return source1.Provider.Execute<bool> (
  886. StaticCall (
  887. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  888. source1.Expression,
  889. Expression.Constant (source2, typeof (IEnumerable<TSource>))));
  890. }
  891. public static bool SequenceEqual<TSource> (this IQueryable<TSource> source1, IEnumerable<TSource> source2, IEqualityComparer<TSource> comparer)
  892. {
  893. Check.Source1AndSource2 (source1, source2);
  894. return source1.Provider.Execute<bool> (
  895. StaticCall (
  896. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  897. source1.Expression,
  898. Expression.Constant (source2, typeof (IEnumerable<TSource>)),
  899. Expression.Constant (comparer, typeof (IEqualityComparer<TSource>))));
  900. }
  901. #endregion
  902. #region Single
  903. public static TSource Single<TSource> (this IQueryable<TSource> source)
  904. {
  905. Check.Source (source);
  906. return source.Provider.Execute<TSource> (
  907. StaticCall (
  908. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  909. source.Expression));
  910. }
  911. public static TSource Single<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
  912. {
  913. Check.SourceAndPredicate (source, predicate);
  914. return source.Provider.Execute<TSource> (
  915. StaticCall (
  916. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  917. source.Expression,
  918. Expression.Quote (predicate)));
  919. }
  920. #endregion
  921. #region SingleOrDefault
  922. public static TSource SingleOrDefault<TSource> (this IQueryable<TSource> source)
  923. {
  924. Check.Source (source);
  925. return source.Provider.Execute<TSource> (
  926. StaticCall (
  927. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  928. source.Expression));
  929. }
  930. public static TSource SingleOrDefault<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
  931. {
  932. Check.SourceAndPredicate (source, predicate);
  933. return source.Provider.Execute<TSource> (
  934. StaticCall (
  935. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  936. source.Expression,
  937. Expression.Quote (predicate)));
  938. }
  939. #endregion
  940. #region Skip
  941. public static IQueryable<TSource> Skip<TSource> (this IQueryable<TSource> source, int count)
  942. {
  943. Check.Source (source);
  944. return source.Provider.CreateQuery<TSource> (
  945. StaticCall (
  946. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  947. source.Expression,
  948. Expression.Constant (count)));
  949. }
  950. #endregion
  951. #region SkipWhile
  952. public static IQueryable<TSource> SkipWhile<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
  953. {
  954. Check.SourceAndPredicate (source, predicate);
  955. return source.Provider.CreateQuery<TSource> (
  956. StaticCall (
  957. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  958. source.Expression,
  959. Expression.Quote (predicate)));
  960. }
  961. public static IQueryable<TSource> SkipWhile<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, int, bool>> predicate)
  962. {
  963. Check.SourceAndPredicate (source, predicate);
  964. return source.Provider.CreateQuery<TSource> (
  965. StaticCall (
  966. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  967. source.Expression,
  968. Expression.Quote (predicate)));
  969. }
  970. #endregion
  971. #region Sum
  972. public static int Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, int>> selector)
  973. {
  974. Check.SourceAndSelector (source, selector);
  975. return source.Provider.Execute<int> (
  976. StaticCall (
  977. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  978. source.Expression,
  979. Expression.Quote (selector)));
  980. }
  981. public static int? Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, int?>> selector)
  982. {
  983. Check.SourceAndSelector (source, selector);
  984. return source.Provider.Execute<int?> (
  985. StaticCall (
  986. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  987. source.Expression,
  988. Expression.Quote (selector)));
  989. }
  990. public static long Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, long>> selector)
  991. {
  992. Check.SourceAndSelector (source, selector);
  993. return source.Provider.Execute<long> (
  994. StaticCall (
  995. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  996. source.Expression,
  997. Expression.Quote (selector)));
  998. }
  999. public static long? Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, long?>> selector)
  1000. {
  1001. Check.SourceAndSelector (source, selector);
  1002. return source.Provider.Execute<long?> (
  1003. StaticCall (
  1004. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  1005. source.Expression,
  1006. Expression.Quote (selector)));
  1007. }
  1008. public static float Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, float>> selector)
  1009. {
  1010. Check.SourceAndSelector (source, selector);
  1011. return source.Provider.Execute<float> (
  1012. StaticCall (
  1013. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  1014. source.Expression,
  1015. Expression.Quote (selector)));
  1016. }
  1017. public static float? Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, float?>> selector)
  1018. {
  1019. Check.SourceAndSelector (source, selector);
  1020. return source.Provider.Execute<float?> (
  1021. StaticCall (
  1022. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  1023. source.Expression,
  1024. Expression.Quote (selector)));
  1025. }
  1026. public static double Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, double>> selector)
  1027. {
  1028. Check.SourceAndSelector (source, selector);
  1029. return source.Provider.Execute<double> (
  1030. StaticCall (
  1031. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  1032. source.Expression,
  1033. Expression.Quote (selector)));
  1034. }
  1035. public static double? Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, double?>> selector)
  1036. {
  1037. Check.SourceAndSelector (source, selector);
  1038. return source.Provider.Execute<double?> (
  1039. StaticCall (
  1040. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  1041. source.Expression,
  1042. Expression.Quote (selector)));
  1043. }
  1044. public static decimal Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, decimal>> selector)
  1045. {
  1046. Check.SourceAndSelector (source, selector);
  1047. return source.Provider.Execute<decimal> (
  1048. StaticCall (
  1049. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  1050. source.Expression,
  1051. Expression.Quote (selector)));
  1052. }
  1053. public static decimal? Sum<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, decimal?>> selector)
  1054. {
  1055. Check.SourceAndSelector (source, selector);
  1056. return source.Provider.Execute<decimal?> (
  1057. StaticCall (
  1058. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  1059. source.Expression,
  1060. Expression.Quote (selector)));
  1061. }
  1062. public static int Sum (this IQueryable<int> source)
  1063. {
  1064. Check.Source (source);
  1065. return source.Provider.Execute<int> (
  1066. StaticCall (
  1067. (MethodInfo) MethodBase.GetCurrentMethod (),
  1068. source.Expression));
  1069. }
  1070. public static int? Sum (this IQueryable<int?> source)
  1071. {
  1072. Check.Source (source);
  1073. return source.Provider.Execute<int?> (
  1074. StaticCall (
  1075. (MethodInfo) MethodBase.GetCurrentMethod (),
  1076. source.Expression));
  1077. }
  1078. public static long Sum (this IQueryable<long> source)
  1079. {
  1080. Check.Source (source);
  1081. return source.Provider.Execute<long> (
  1082. StaticCall (
  1083. (MethodInfo) MethodBase.GetCurrentMethod (),
  1084. source.Expression));
  1085. }
  1086. public static long? Sum (this IQueryable<long?> source)
  1087. {
  1088. Check.Source (source);
  1089. return source.Provider.Execute<long?> (
  1090. StaticCall (
  1091. (MethodInfo) MethodBase.GetCurrentMethod (),
  1092. source.Expression));
  1093. }
  1094. public static float Sum (this IQueryable<float> source)
  1095. {
  1096. Check.Source (source);
  1097. return source.Provider.Execute<float> (
  1098. StaticCall (
  1099. (MethodInfo) MethodBase.GetCurrentMethod (),
  1100. source.Expression));
  1101. }
  1102. public static float? Sum (this IQueryable<float?> source)
  1103. {
  1104. Check.Source (source);
  1105. return source.Provider.Execute<float?> (
  1106. StaticCall (
  1107. (MethodInfo) MethodBase.GetCurrentMethod (),
  1108. source.Expression));
  1109. }
  1110. public static double Sum (this IQueryable<double> source)
  1111. {
  1112. Check.Source (source);
  1113. return source.Provider.Execute<double> (
  1114. StaticCall (
  1115. (MethodInfo) MethodBase.GetCurrentMethod (),
  1116. source.Expression));
  1117. }
  1118. public static double? Sum (this IQueryable<double?> source)
  1119. {
  1120. Check.Source (source);
  1121. return source.Provider.Execute<double?> (
  1122. StaticCall (
  1123. (MethodInfo) MethodBase.GetCurrentMethod (),
  1124. source.Expression));
  1125. }
  1126. public static decimal Sum (this IQueryable<decimal> source)
  1127. {
  1128. Check.Source (source);
  1129. return source.Provider.Execute<decimal> (
  1130. StaticCall (
  1131. (MethodInfo) MethodBase.GetCurrentMethod (),
  1132. source.Expression));
  1133. }
  1134. public static decimal? Sum (this IQueryable<decimal?> source)
  1135. {
  1136. Check.Source (source);
  1137. return source.Provider.Execute<decimal?> (
  1138. StaticCall (
  1139. (MethodInfo) MethodBase.GetCurrentMethod (),
  1140. source.Expression));
  1141. }
  1142. #endregion
  1143. #region Take
  1144. public static IQueryable<TSource> Take<TSource> (this IQueryable<TSource> source, int count)
  1145. {
  1146. Check.Source (source);
  1147. return source.Provider.CreateQuery<TSource> (
  1148. StaticCall (
  1149. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  1150. source.Expression,
  1151. Expression.Constant (count)));
  1152. }
  1153. #endregion
  1154. #region TakeWhile
  1155. public static IQueryable<TSource> TakeWhile<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
  1156. {
  1157. Check.SourceAndPredicate (source, predicate);
  1158. return source.Provider.CreateQuery<TSource> (
  1159. StaticCall (
  1160. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  1161. source.Expression,
  1162. Expression.Quote (predicate)));
  1163. }
  1164. public static IQueryable<TSource> TakeWhile<TSource> (this IQueryable<TSource> source, Expression<Func<TSource, int, bool>> predicate)
  1165. {
  1166. Check.SourceAndPredicate (source, predicate);
  1167. return source.Provider.CreateQuery<TSource> (
  1168. StaticCall (
  1169. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource)),
  1170. source.Expression,
  1171. Expression.Quote (predicate)));
  1172. }
  1173. #endregion
  1174. #region ThenBy
  1175. public static IOrderedQueryable<TSource> ThenBy<TSource, TKey> (this IOrderedQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector)
  1176. {
  1177. Check.SourceAndKeySelector (source, keySelector);
  1178. return (IOrderedQueryable<TSource>) source.Provider.CreateQuery (
  1179. StaticCall (
  1180. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)),
  1181. source.Expression,
  1182. Expression.Quote (keySelector)));
  1183. }
  1184. public static IOrderedQueryable<TSource> ThenBy<TSource, TKey> (this IOrderedQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer)
  1185. {
  1186. Check.SourceAndKeySelector (source, keySelector);
  1187. return (IOrderedQueryable<TSource>) source.Provider.CreateQuery (
  1188. StaticCall (
  1189. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)),
  1190. source.Expression,
  1191. Expression.Quote (keySelector),
  1192. Expression.Constant (comparer, typeof (IComparer<TKey>))));
  1193. }
  1194. #endregion
  1195. #region ThenByDescending
  1196. public static IOrderedQueryable<TSource> ThenByDescending<TSource, TKey> (this IOrderedQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector)
  1197. {
  1198. Check.SourceAndKeySelector (source, keySelector);
  1199. return (IOrderedQueryable<TSource>) source.Provider.CreateQuery (
  1200. StaticCall (
  1201. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)),
  1202. source.Expression,
  1203. Expression.Quote (keySelector)));
  1204. }
  1205. public static IOrderedQueryable<TSource> ThenByDescending<TSource, TKey> (this IOrderedQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, IComparer<TKey> comparer)
  1206. {
  1207. Check.SourceAndKeySelector (source, keySelector);
  1208. return (IOrderedQueryable<TSource>) source.Provider.CreateQuery (
  1209. StaticCall (
  1210. MakeGeneric (MethodBase.GetCurrentMethod (), typeof (TSource), typeof (TKey)),
  1211. source.Expression,
  1212. Expression.Quote (keySelector),
  1213. Expression.Constant (comparer, typeof (IComparer<TKey>))));
  1214. }
  1215. #endregion
  1216. #region Union
  1217. public static IQueryable<TSource> Union<TSource> (this IQueryable<TSource> source1, IEnumerable<TSou

Large files files are truncated, but you can click here to view the full file