11.5.1 使用 join 子句的内连接

如果你打算把一个巨大的序列连接到一个极小的序列上,应尽可能把小序列作为右边序列

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var query = from defect in SampleData.AllDefects
  6. join subscription in SampleData.AllSubscriptions
  7. on defect.Project equals subscription.Project
  8. select new { defect.Summary, subscription.EmailAddress };
  9.  
  10. foreach (var item in query)
  11. {
  12. Console.WriteLine("{0} {1}", item.Summary, item.EmailAddress);
  13. }
  14.  
  15. Console.ReadKey();
  16. }
  17. }

我们通常需要对序列进行过滤,而在连接前进行过滤比在连接后过滤效率要高得多。
在这个阶段,假如只有左边的序列需要进行过滤,查询表达式相对简单一些。例如,如果我们只想显示已经关闭的缺陷,我们可以使用下面的查询表达式

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var query = from defect in SampleData.AllDefects
  6. where defect.Status == Status.Closed
  7. join subscription in SampleData.AllSubscriptions
  8. on defect.Project equals subscription.Project
  9. select new { defect.Summary, subscription.EmailAddress };
  10.  
  11. var query2 = from subscription in SampleData.AllSubscriptions
  12. join defect in (from defect in SampleData.AllDefects
  13. where defect.Status == Status.Closed
  14. select defect)
  15. on subscription.Project equals defect.Project
  16. select new { defect.Summary, subscription.EmailAddress };
  17.  
  18. foreach (var item in query)
  19. {
  20. Console.WriteLine("{0} {1}", item.Summary, item.EmailAddress);
  21. }
  22.  
  23. Console.ReadKey();
  24. }
  25. }

11.5.2 使用 join...into 子句进行分组连接

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var query = from defect in SampleData.AllDefects
  6. join subscription in SampleData.AllSubscriptions
  7. on defect.Project equals subscription.Project
  8. into groupSubscriptions
  9. select new { Defect = defect, Subscription = groupSubscriptions };
  10.  
  11. foreach (var entry in query)
  12. {
  13. Console.WriteLine(entry.Defect.Summary);
  14. foreach (var subscription in entry.Subscription)
  15. {
  16. Console.WriteLine(" {0} ", subscription.EmailAddress);
  17. }
  18. }
  19.  
  20. Console.ReadKey();
  21. }
  22. }
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var dates = new DateTimeRange(SampleData.Start, SampleData.End);
  6.  
  7. var query = from date in dates
  8. join defect in SampleData.AllDefects
  9. on date equals defect.Created.Date
  10. into joined
  11. select new { Date = date, Count = joined.Count() };
  12.  
  13. var query2 = dates.GroupJoin(SampleData.AllDefects,
  14. date => date,
  15. defect => defect.Created.Date,
  16. (date, joined) => new { Date = date, Count = joined.Count() });
  17.  
  18. foreach (var item in query)
  19. {
  20. Console.WriteLine("{0:d} {1}", item.Date, item.Count);
  21. }
  22.  
  23. Console.ReadKey();
  24. }
  25. }

11.5.3 使用多个 from 子句进行交叉连接和合并序列

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var query = from left in Enumerable.Range(, )
  6. from right in Enumerable.Range(, left)
  7. select new { Left = left, Right = right };
  8.  
  9. var query2 = Enumerable.Range(, )
  10. .SelectMany(left => Enumerable.Range(, left),
  11. (left, right) => new { Left = left, Right = right });
  12.  
  13. foreach (var item in query)
  14. {
  15. Console.WriteLine("Left= {0} Right= {1} ", item.Left, item.Right);
  16. }
  17.  
  18. Console.ReadKey();
  19. }
  20. }

SampleData代码,如下

  1. public class SampleData
  2. {
  3. static List<Defect> defects;
  4. static List<User> users;
  5. static List<Project> projects;
  6. static List<NotificationSubscription> subscriptions;
  7.  
  8. public static readonly DateTime Start = May();
  9. public static readonly DateTime End = May();
  10.  
  11. public static IEnumerable<Defect> AllDefects
  12. {
  13. get { return defects; }
  14. }
  15.  
  16. public static IEnumerable<User> AllUsers
  17. {
  18. get { return users; }
  19. }
  20.  
  21. public static IEnumerable<Project> AllProjects
  22. {
  23. get { return projects; }
  24. }
  25.  
  26. public static IEnumerable<NotificationSubscription> AllSubscriptions
  27. {
  28. get { return subscriptions; }
  29. }
  30.  
  31. public static class Projects
  32. {
  33. public static readonly Project SkeetyMediaPlayer = new Project { Name = "Skeety Media Player" };
  34. public static readonly Project SkeetyTalk = new Project { Name = "Skeety Talk" };
  35. public static readonly Project SkeetyOffice = new Project { Name = "Skeety Office" };
  36. }
  37.  
  38. public static class Users
  39. {
  40. public static readonly User TesterTim = new User("Tim Trotter", UserType.Tester);
  41. public static readonly User TesterTara = new User("Tara Tutu", UserType.Tester);
  42. public static readonly User DeveloperDeborah = new User("Deborah Denton", UserType.Developer);
  43. public static readonly User DeveloperDarren = new User("Darren Dahlia", UserType.Developer);
  44. public static readonly User ManagerMary = new User("Mary Malcop", UserType.Manager);
  45. public static readonly User CustomerColin = new User("Colin Carton", UserType.Customer);
  46. }
  47.  
  48. static SampleData()
  49. {
  50. projects = new List<Project>
  51. {
  52. Projects.SkeetyMediaPlayer,
  53. Projects.SkeetyTalk,
  54. Projects.SkeetyOffice
  55. };
  56.  
  57. users = new List<User>
  58. {
  59. Users.TesterTim,
  60. Users.TesterTara,
  61. Users.DeveloperDeborah,
  62. Users.DeveloperDarren,
  63. Users.ManagerMary,
  64. Users.CustomerColin
  65. };
  66.  
  67. subscriptions = new List<NotificationSubscription>
  68. {
  69. new NotificationSubscription { Project=Projects.SkeetyMediaPlayer, EmailAddress="media-bugs@skeetysoft.com" },
  70. new NotificationSubscription { Project=Projects.SkeetyTalk, EmailAddress="talk-bugs@skeetysoft.com" },
  71. new NotificationSubscription { Project=Projects.SkeetyOffice, EmailAddress="office-bugs@skeetysoft.com" },
  72. new NotificationSubscription { Project=Projects.SkeetyMediaPlayer, EmailAddress="theboss@skeetysoft.com"}
  73. };
  74.  
  75. defects = new List<Defect>
  76. {
  77. new Defect
  78. {
  79. Project = Projects.SkeetyMediaPlayer,
  80. Created = May(),
  81. CreatedBy = Users.TesterTim,
  82. Summary = "MP3 files crash system",
  83. Severity = Severity.Showstopper,
  84. AssignedTo = Users.DeveloperDarren,
  85. Status = Status.Accepted,
  86. LastModified = May()
  87. },
  88.  
  89. new Defect
  90. {
  91. Project = Projects.SkeetyMediaPlayer,
  92. Created = May(),
  93. CreatedBy = Users.DeveloperDeborah,
  94. Summary = "Text is too big",
  95. Severity = Severity.Trivial,
  96. AssignedTo = null,
  97. Status = Status.Closed,
  98. LastModified = May()
  99. },
  100.  
  101. new Defect
  102. {
  103. Project = Projects.SkeetyTalk,
  104. Created = May(),
  105. CreatedBy = Users.CustomerColin,
  106. Summary = "Sky is wrong shade of blue",
  107. Severity = Severity.Minor,
  108. AssignedTo = Users.TesterTara,
  109. Status = Status.Fixed,
  110. LastModified = May()
  111. },
  112.  
  113. new Defect
  114. {
  115. Project = Projects.SkeetyMediaPlayer,
  116. Created = May(),
  117. CreatedBy = Users.DeveloperDarren,
  118. Summary = "Can't play files more than 200 bytes long",
  119. Severity = Severity.Major,
  120. AssignedTo = Users.DeveloperDarren,
  121. Status = Status.Reopened,
  122. LastModified = May()
  123. },
  124.  
  125. new Defect
  126. {
  127. Project = Projects.SkeetyMediaPlayer,
  128. Created = May(),
  129. CreatedBy = Users.TesterTim,
  130. Summary = "Installation is slow",
  131. Severity = Severity.Trivial,
  132. AssignedTo = Users.TesterTim,
  133. Status = Status.Fixed,
  134. LastModified = May()
  135. },
  136.  
  137. new Defect
  138. {
  139. Project = Projects.SkeetyMediaPlayer,
  140. Created = May(),
  141. CreatedBy = Users.ManagerMary,
  142. Summary = "DivX is choppy on Pentium 100",
  143. Severity = Severity.Major,
  144. AssignedTo = Users.DeveloperDarren,
  145. Status = Status.Accepted,
  146. LastModified = May()
  147. },
  148.  
  149. new Defect
  150. {
  151. Project = Projects.SkeetyTalk,
  152. Created = May(),
  153. CreatedBy = Users.DeveloperDeborah,
  154. Summary = "Client acts as virus",
  155. Severity = Severity.Showstopper,
  156. AssignedTo = null,
  157. Status = Status.Closed,
  158. LastModified = May()
  159. },
  160.  
  161. new Defect
  162. {
  163. Project = Projects.SkeetyMediaPlayer,
  164. Created = May(),
  165. CreatedBy = Users.DeveloperDarren,
  166. Summary = "Subtitles only work in Welsh",
  167. Severity = Severity.Major,
  168. AssignedTo = Users.TesterTim,
  169. Status = Status.Fixed,
  170. LastModified = May()
  171. },
  172.  
  173. new Defect
  174. {
  175. Project = Projects.SkeetyTalk,
  176. Created = May(),
  177. CreatedBy = Users.CustomerColin,
  178. Summary = "Voice recognition is confused by background noise",
  179. Severity = Severity.Minor,
  180. AssignedTo = null,
  181. Status = Status.Closed,
  182. LastModified = May()
  183. },
  184.  
  185. new Defect
  186. {
  187. Project = Projects.SkeetyTalk,
  188. Created = May(),
  189. CreatedBy = Users.TesterTim,
  190. Summary = "User interface should be more caramelly",
  191. Severity = Severity.Trivial,
  192. AssignedTo = Users.DeveloperDarren,
  193. Status = Status.Created,
  194. LastModified = May()
  195. },
  196.  
  197. new Defect
  198. {
  199. Project = Projects.SkeetyMediaPlayer,
  200. Created = May(),
  201. CreatedBy = Users.ManagerMary,
  202. Summary = "Burning a CD makes the printer catch fire",
  203. Severity = Severity.Showstopper,
  204. AssignedTo = null,
  205. Status = Status.Closed,
  206. LastModified = May()
  207. },
  208.  
  209. new Defect
  210. {
  211. Project = Projects.SkeetyTalk,
  212. Created = May(),
  213. CreatedBy = Users.TesterTara,
  214. Summary = "Peer to peer pairing passes parameters poorly",
  215. Severity = Severity.Minor,
  216. AssignedTo = Users.DeveloperDarren,
  217. Status = Status.Accepted,
  218. LastModified = May()
  219. },
  220.  
  221. new Defect
  222. {
  223. Project = Projects.SkeetyTalk,
  224. Created = May(),
  225. CreatedBy = Users.DeveloperDarren,
  226. Summary = "Delay when sending message",
  227. Severity = Severity.Minor,
  228. AssignedTo = Users.TesterTara,
  229. Status = Status.Fixed,
  230. LastModified = May()
  231. },
  232.  
  233. new Defect
  234. {
  235. Project = Projects.SkeetyMediaPlayer,
  236. Created = May(),
  237. CreatedBy = Users.ManagerMary,
  238. Summary = "Volume control needs to go to 11",
  239. Severity = Severity.Minor,
  240. AssignedTo = Users.DeveloperDarren,
  241. Status = Status.Created,
  242. LastModified = May()
  243. },
  244.  
  245. new Defect
  246. {
  247. Project = Projects.SkeetyMediaPlayer,
  248. Created = May(),
  249. CreatedBy = Users.CustomerColin,
  250. Summary = "Splash screen fades too quickly",
  251. Severity = Severity.Minor,
  252. AssignedTo = Users.TesterTara,
  253. Status = Status.Fixed,
  254. LastModified = May()
  255. },
  256.  
  257. new Defect
  258. {
  259. Project = Projects.SkeetyTalk,
  260. Created = May(),
  261. CreatedBy = Users.DeveloperDeborah,
  262. Summary = "Text box doesn't keep up with fast typing",
  263. Severity = Severity.Major,
  264. AssignedTo = Users.DeveloperDeborah,
  265. Status = Status.Accepted,
  266. LastModified = May()
  267. },
  268.  
  269. new Defect
  270. {
  271. Project = Projects.SkeetyTalk,
  272. Created = May(),
  273. CreatedBy = Users.DeveloperDarren,
  274. Summary = "Password displayed in plain text",
  275. Severity = Severity.Showstopper,
  276. AssignedTo = null,
  277. Status = Status.Closed,
  278. LastModified = May()
  279. },
  280.  
  281. new Defect
  282. {
  283. Project = Projects.SkeetyMediaPlayer,
  284. Created = May(),
  285. CreatedBy = Users.TesterTim,
  286. Summary = "Play button points the wrong way",
  287. Severity = Severity.Major,
  288. AssignedTo = Users.TesterTim,
  289. Status = Status.Fixed,
  290. LastModified = May()
  291. },
  292.  
  293. new Defect
  294. {
  295. Project = Projects.SkeetyMediaPlayer,
  296. Created = May(),
  297. CreatedBy = Users.CustomerColin,
  298. Summary = "Wizard needed for CD burning",
  299. Severity = Severity.Minor,
  300. AssignedTo = Users.CustomerColin,
  301. Status = Status.Fixed,
  302. LastModified = May()
  303. },
  304.  
  305. new Defect
  306. {
  307. Project = Projects.SkeetyMediaPlayer,
  308. Created = May(),
  309. CreatedBy = Users.ManagerMary,
  310. Summary = "Subtitles don't display during fast forward",
  311. Severity = Severity.Trivial,
  312. AssignedTo = Users.DeveloperDarren,
  313. Status = Status.Accepted,
  314. LastModified = May()
  315. },
  316.  
  317. new Defect
  318. {
  319. Project = Projects.SkeetyMediaPlayer,
  320. Created = May(),
  321. CreatedBy = Users.DeveloperDarren,
  322. Summary = "Memory leak when watching Memento",
  323. Severity = Severity.Trivial,
  324. AssignedTo = Users.DeveloperDeborah,
  325. Status = Status.Created,
  326. LastModified = May()
  327. },
  328.  
  329. new Defect
  330. {
  331. Project = Projects.SkeetyTalk,
  332. Created = May(),
  333. CreatedBy = Users.DeveloperDeborah,
  334. Summary = "Profile screen shows login count of -1",
  335. Severity = Severity.Major,
  336. AssignedTo = Users.DeveloperDeborah,
  337. Status = Status.Accepted,
  338. LastModified = May()
  339. },
  340.  
  341. new Defect
  342. {
  343. Project = Projects.SkeetyTalk,
  344. Created = May(),
  345. CreatedBy = Users.TesterTim,
  346. Summary = "Server crashes under heavy load (3 users)",
  347. Severity = Severity.Major,
  348. AssignedTo = Users.DeveloperDeborah,
  349. Status = Status.Accepted,
  350. LastModified = May()
  351. },
  352.  
  353. new Defect
  354. {
  355. Project = Projects.SkeetyMediaPlayer,
  356. Created = May(),
  357. CreatedBy = Users.TesterTara,
  358. Summary = "Unable to connect to any media server",
  359. Severity = Severity.Showstopper,
  360. AssignedTo = Users.DeveloperDarren,
  361. Status = Status.Reopened,
  362. LastModified = May()
  363. },
  364.  
  365. new Defect
  366. {
  367. Project = Projects.SkeetyMediaPlayer,
  368. Created = May(),
  369. CreatedBy = Users.DeveloperDeborah,
  370. Summary = "UI turns black and white when playing old films",
  371. Severity = Severity.Minor,
  372. AssignedTo = Users.TesterTara,
  373. Status = Status.Fixed,
  374. LastModified = May()
  375. },
  376.  
  377. new Defect
  378. {
  379. Project = Projects.SkeetyTalk,
  380. Created = May(),
  381. CreatedBy = Users.ManagerMary,
  382. Summary = "Password reset changes passwords for all users",
  383. Severity = Severity.Showstopper,
  384. AssignedTo = null,
  385. Status = Status.Closed,
  386. LastModified = May()
  387. },
  388.  
  389. new Defect
  390. {
  391. Project = Projects.SkeetyMediaPlayer,
  392. Created = May(),
  393. CreatedBy = Users.TesterTim,
  394. Summary = "Modern music sounds rubbish",
  395. Severity = Severity.Trivial,
  396. AssignedTo = Users.DeveloperDarren,
  397. Status = Status.Created,
  398. LastModified = May()
  399. },
  400.  
  401. new Defect
  402. {
  403. Project = Projects.SkeetyTalk,
  404. Created = May(),
  405. CreatedBy = Users.TesterTim,
  406. Summary = "Webcam makes me look bald",
  407. Severity = Severity.Showstopper,
  408. AssignedTo = Users.TesterTim,
  409. Status = Status.Fixed,
  410. LastModified = May()
  411. },
  412.  
  413. new Defect
  414. {
  415. Project = Projects.SkeetyTalk,
  416. Created = May(),
  417. CreatedBy = Users.CustomerColin,
  418. Summary = "Sound is distorted when speakers are underwater",
  419. Severity = Severity.Major,
  420. AssignedTo = Users.DeveloperDarren,
  421. Status = Status.Created,
  422. LastModified = May()
  423. },
  424.  
  425. new Defect
  426. {
  427. Project = Projects.SkeetyTalk,
  428. Created = May(),
  429. CreatedBy = Users.DeveloperDarren,
  430. Summary = "Japanese characters don't display properly",
  431. Severity = Severity.Major,
  432. AssignedTo = Users.DeveloperDeborah,
  433. Status = Status.Accepted,
  434. LastModified = May()
  435. },
  436.  
  437. new Defect
  438. {
  439. Project = Projects.SkeetyMediaPlayer,
  440. Created = May(),
  441. CreatedBy = Users.TesterTara,
  442. Summary = "Video takes 100% of CPU",
  443. Severity = Severity.Major,
  444. AssignedTo = Users.DeveloperDeborah,
  445. Status = Status.Accepted,
  446. LastModified = May()
  447. },
  448.  
  449. new Defect
  450. {
  451. Project = Projects.SkeetyMediaPlayer,
  452. Created = May(),
  453. CreatedBy = Users.TesterTim,
  454. Summary = "DVD Easter eggs unavailable",
  455. Severity = Severity.Trivial,
  456. AssignedTo = Users.DeveloperDarren,
  457. Status = Status.Created,
  458. LastModified = May()
  459. },
  460.  
  461. new Defect
  462. {
  463. Project = Projects.SkeetyTalk,
  464. Created = May(),
  465. CreatedBy = Users.ManagerMary,
  466. Summary = "Transparency is high for menus to be readable",
  467. Severity = Severity.Minor,
  468. AssignedTo = Users.DeveloperDeborah,
  469. Status = Status.Accepted,
  470. LastModified = May()
  471. },
  472.  
  473. new Defect
  474. {
  475. Project = Projects.SkeetyMediaPlayer,
  476. Created = May(),
  477. CreatedBy = Users.CustomerColin,
  478. Summary = "About box is missing version number",
  479. Severity = Severity.Minor,
  480. AssignedTo = Users.CustomerColin,
  481. Status = Status.Fixed,
  482. LastModified = May()
  483. },
  484.  
  485. new Defect
  486. {
  487. Project = Projects.SkeetyTalk,
  488. Created = May(),
  489. CreatedBy = Users.TesterTim,
  490. Summary = "Logs record confidential conversations",
  491. Severity = Severity.Major,
  492. AssignedTo = Users.DeveloperDarren,
  493. Status = Status.Reopened,
  494. LastModified = May()
  495. },
  496.  
  497. new Defect
  498. {
  499. Project = Projects.SkeetyTalk,
  500. Created = May(),
  501. CreatedBy = Users.DeveloperDeborah,
  502. Summary = "Profanity filter is too aggressive",
  503. Severity = Severity.Minor,
  504. AssignedTo = Users.TesterTara,
  505. Status = Status.Fixed,
  506. LastModified = May()
  507. },
  508.  
  509. new Defect
  510. {
  511. Project = Projects.SkeetyMediaPlayer,
  512. Created = May(),
  513. CreatedBy = Users.TesterTara,
  514. Summary = "Full screen mode fails on dual monitors",
  515. Severity = Severity.Minor,
  516. AssignedTo = Users.DeveloperDeborah,
  517. Status = Status.Created,
  518. LastModified = May()
  519. },
  520.  
  521. new Defect
  522. {
  523. Project = Projects.SkeetyMediaPlayer,
  524. Created = May(),
  525. CreatedBy = Users.CustomerColin,
  526. Summary = "Visualization hypnotises pets",
  527. Severity = Severity.Minor,
  528. AssignedTo = Users.DeveloperDeborah,
  529. Status = Status.Accepted,
  530. LastModified = May()
  531. },
  532.  
  533. new Defect
  534. {
  535. Project = Projects.SkeetyTalk,
  536. Created = May(),
  537. CreatedBy = Users.ManagerMary,
  538. Summary = "Resizing while typing loses input",
  539. Severity = Severity.Trivial,
  540. AssignedTo = Users.DeveloperDarren,
  541. Status = Status.Created,
  542. LastModified = May()
  543. },
  544.  
  545. new Defect
  546. {
  547. Project = Projects.SkeetyMediaPlayer,
  548. Created = May(),
  549. CreatedBy = Users.TesterTim,
  550. Summary = "Network is saturated when playing WAV file",
  551. Severity = Severity.Minor,
  552. AssignedTo = Users.TesterTim,
  553. Status = Status.Fixed,
  554. LastModified = May()
  555. },
  556.  
  557. new Defect
  558. {
  559. Project = Projects.SkeetyMediaPlayer,
  560. Created = May(),
  561. CreatedBy = Users.TesterTara,
  562. Summary = "Media library tells user to keep the noise down",
  563. Severity = Severity.Major,
  564. AssignedTo = Users.DeveloperDarren,
  565. Status = Status.Created,
  566. LastModified = May()
  567. }
  568. };
  569. }
  570.  
  571. public static DateTime May(int day)
  572. {
  573. return new DateTime(, , day);
  574. }
  575.  
  576. }
  577. public enum UserType : byte
  578. {
  579. Customer,
  580. Developer,
  581. Tester,
  582. Manager,
  583. }
  584. public class Defect
  585. {
  586. public Project Project { get; set; }
  587. /// <summary>
  588. /// Which user is this defect currently assigned to? Should not be null until the status is Closed.
  589. /// </summary>
  590. public User AssignedTo { get; set; }
  591. public string Summary { get; set; }
  592. public Severity Severity { get; set; }
  593. public Status Status { get; set; }
  594. public DateTime Created { get; set; }
  595. public DateTime LastModified { get; set; }
  596. public User CreatedBy { get; set; }
  597. public int ID { get; private set; }
  598.  
  599. public Defect()
  600. {
  601. ID = StaticCounter.Next();
  602. }
  603.  
  604. public override string ToString()
  605. {
  606. return string.Format("{0,2}: {1}\r\n ({2:d}-{3:d}, {4}/{5}, {6} -> {7})",
  607. ID, Summary, Created, LastModified, Severity, Status, CreatedBy.Name,
  608. AssignedTo == null ? "n/a" : AssignedTo.Name);
  609. }
  610. }
  611. public class NotificationSubscription
  612. {
  613. /// <summary>
  614. /// Project for which this subscriber is notified
  615. /// </summary>
  616. public Project Project { get; set; }
  617.  
  618. /// <summary>
  619. /// The address to send the notification to
  620. /// </summary>
  621. public string EmailAddress { get; set; }
  622. }
  623. public class Project
  624. {
  625. public string Name { get; set; }
  626.  
  627. public override string ToString()
  628. {
  629. return string.Format("Project: {0}", Name);
  630. }
  631. }
  632. public enum Severity : byte
  633. {
  634. Trivial,
  635. Minor,
  636. Major,
  637. Showstopper,
  638. }
  639. public static class StaticCounter
  640. {
  641. static int next = ;
  642. public static int Next()
  643. {
  644. return next++;
  645. }
  646. }
  647. public enum Status : byte
  648. {
  649. /// <summary>
  650. /// Defect has been opened, but not verified as reproducible or an issue.
  651. /// </summary>
  652. Created,
  653. /// <summary>
  654. /// Defect has been verified as an issue requiring work.
  655. /// </summary>
  656. Accepted,
  657. /// <summary>
  658. /// Defect has been fixed in code, but not verified other than through developer testing.
  659. /// </summary>
  660. Fixed,
  661. /// <summary>
  662. /// Defect was fixed, but has now been reopened due to failing verification.
  663. /// </summary>
  664. Reopened,
  665. /// <summary>
  666. /// Defect has been fixed and tested; the fix is satisfactory.
  667. /// </summary>
  668. Closed,
  669. }
  670. public class User
  671. {
  672. public string Name { get; set; }
  673. public UserType UserType { get; set; }
  674.  
  675. public User(string name, UserType userType)
  676. {
  677. Name = name;
  678. UserType = userType;
  679. }
  680.  
  681. public override string ToString()
  682. {
  683. return string.Format("User: {0} ({1})", Name, UserType);
  684. }
  685. }
  686. static class Extensions
  687. {
  688. public static Dummy<T> Where<T>(this Dummy<T> dummy,
  689. Func<T, bool> predicate)
  690. {
  691. Console.WriteLine("Where called");
  692. return dummy;
  693. }
  694. }
  695. class Dummy<T>
  696. {
  697. public Dummy<U> Select<U>(Func<T, U> selector)
  698. {
  699. Console.WriteLine("Select called");
  700. return new Dummy<U>();
  701. }
  702. }
  703. public class DateTimeRange : IEnumerable<DateTime>
  704. {
  705. private readonly DateTime start;
  706. private readonly DateTime end;
  707.  
  708. public DateTimeRange(DateTime start, DateTime end)
  709. {
  710. this.start = start;
  711. this.end = end;
  712. }
  713.  
  714. public IEnumerator<DateTime> GetEnumerator()
  715. {
  716. for (DateTime current = start; current <= end; current = current.AddDays())
  717. {
  718. yield return current;
  719. }
  720. }
  721.  
  722. IEnumerator IEnumerable.GetEnumerator()
  723. {
  724. return GetEnumerator();
  725. }
  726. }

11.5 【Linq 】连接的更多相关文章

  1. [转]Linux服务器上11种网络连接状态 和 TCP三次握手/四次挥手详解

    一.Linux服务器上11种网络连接状态: 图:TCP的状态机 通常情况下:一个正常的TCP连接,都会有三个阶段:1.TCP三次握手;2.数据传送;3.TCP四次挥手. 注:以下说明最好能结合”图:T ...

  2. Linq连接查询之左连接、右连接、内连接、全连接、交叉连接、Union合并、Concat连接、Intersect相交、Except与非查询

    内连接查询 内连接与SqL中inner join一样,即找出两个序列的交集 Model1Container model = new Model1Container(); //内连接 var query ...

  3. C#高级编程9 第11章 Linq

    Linq 1.Linq概述 列表和实体 准备数据: public class Championship { public int Year { get; set; } public string Fi ...

  4. linq连接sqlite数据库(linq to sqlite) .net3.5

    http://www.cnblogs.com/xianyin05/archive/2012/12/23/2829905.html using Models; using System; using S ...

  5. C#高级编程(第9版) 第11章 LINQ 笔记

    概述语言集成查询(Language Integrated Query, LINQ)在C#编程语言中集成了查询语法,可以用相同的语法访问不同的数据源.LINQ提供了不同数据源的抽象层,所以可以使用相同的 ...

  6. 11、Linq的使用

    一.种类 1.Linq to Objects,实现了IEnumerable<T>集合对象的集成查询 2.Linq to sql,针对关系数据库MSSQL的解释查询 3.Linq to En ...

  7. boost::asio 连接管理11 如何关闭连接

    在实际产品运行中,对连接管理有了更新的认识,这里分享一下. shared_ptr管理连接对象的生命周期 shared_ptr的引用计数器决定了连接对象的生命周期.这里我说的连接对象就是在我的前文:ht ...

  8. 如何在Ubuntu 11.10上连接L2TP VPN

    要在家继续项目的开发,但架设的GitLab只能校内访问,更悲催的是学校架设的SSL VPN不支持Linux,好在想起学校以前架设的L2TP VPN,应该可以支持Linux,于是便一通谷歌百度,然而发现 ...

  9. 11.hibernate的连接查询

    1.创建如下javaweb项目结构 2.在项目的src下创建hibernate.cfg.xml主配置文件 <?xml version="1.0" encoding=" ...

  10. LINQ之路11:LINQ Operators之过滤(Filtering)

    在本系列博客前面的篇章中,已经对LINQ的作用.C# 3.0为LINQ提供的新特性,还有几种典型的LINQ技术:LINQ to Objects.LINQ to SQL.Entity Framework ...

随机推荐

  1. 关于压缩软件gzip和xz的简单对照

    晚上因为处理磁盘报警的须要.进行了日志压缩,在此次压缩中分别使用了gzip和xz软件对文本进行了压缩.压缩的结果很令人诧异. 出于对xz好奇的原因是因为在下载内核源码时常常能够看到.xz格式的文件包. ...

  2. [React] Refactor a connected Redux component to use Unstated

    In this lesson, I refactor a simple Counter component connected to Redux to use Unstated instead. I ...

  3. matlab中怎样加入凝视

    1)方法一 选中你要加凝视的内容,然后选择工具菜单"text|comment"就能够了,假设要把凝视变为语句,相同选中要转变的语句,然后用鼠标选择"text|uncomm ...

  4. Android游戏框架Libgdx使用入门

    转载自:http://blog.csdn.net/cping1982/article/details/6176191 Libgdx作者博客:http://www.badlogicgames.com/ ...

  5. test框架搭建

     http://blog.csdn.net/huilan_same  https://github.com/huilansame/Test_framework  

  6. Oracle 静态监听注冊具体解释

    Oracle 静态监听注冊具体解释 网上有非常多关于oracle 监听静态注冊的文章.但大多都是简单说说,并没有具体的样例.这里,将结合linux as4 下的oracle 10gR2.0.1 举一个 ...

  7. hdu1116 Play on Words--并查集

    原题链接: pid=1116">http://acm.hdu.edu.cn/showproblem.php? pid=1116 一:原题内容 Problem Description S ...

  8. MySQL基础教程-绝对推荐

    https://wenku.baidu.com/view/1acfe579ee06eff9aef80752.html?from=search MySQL--公司培训PPT Mysql体系结构以及与Or ...

  9. poj2342 Anniversary party (树形dp)

    poj2342 Anniversary party (树形dp) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9128   ...

  10. bzoj 4481 [ Jsoi 2015 ] 非诚勿扰 —— 期望

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4481 太弱了这种题都要看半天TJ...:https://blog.csdn.net/chai ...