Queryable.cs 49 KB

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