Queryable.cs 49 KB

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