Advertisement
Guest User

Untitled

a guest
Aug 25th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.15 KB | None | 0 0
  1. using System;
  2. using System.Linq;
  3.  
  4. class Program
  5. {
  6. static void 要件()
  7. {
  8. var db = new[] { new { Id = 1, Name = "abc" } };
  9.  
  10. var q =
  11. from x in db
  12. where x.Id < 100
  13. orderby x.Id
  14. select x.Name;
  15.  
  16. // ↓最終的にこうなってほしい
  17.  
  18. db.Query(@"
  19. SELECT Name FROM [table name]
  20. WHERE Id < 100
  21. ORDER BY Id
  22. ");
  23. }
  24.  
  25. static void 問題_式ツリーは静的()
  26. {
  27. var db = new[] { new { Id = 1, Name = "abc", Description = "some messages" } };
  28.  
  29. // これは、コンパイル時に確定してるもので、
  30. // コンパイル結果は固定的。実行時変更書けることできない
  31. var q =
  32. from x in db
  33. where x.Id < 100
  34. orderby x.Id
  35. select x.Name;
  36.  
  37. // 例えば、Name 固定じゃなく、Name か Description かをユーザー入力で分岐、みたいなことは無理
  38. // 以下、疑似コード。コンパイル不可
  39. var selectedMember = Console.ReadLine() == "Name" ? x.Name : x.Description;
  40.  
  41. var q =
  42. from x in db
  43. where x.Id < 100
  44. orderby x.Id
  45. select selectedMember;
  46.  
  47. // だったら、実行時に何か処理するの無駄じゃない?
  48. // db.Query 作るのになんで、実行時に Expression を走査して SQL 組まなきゃいけないの?
  49.  
  50. // 実際、LINQ to Entities のパフォーマンス悪い!って言われてる理由の何割かはこのせい。
  51. // 生成される SQL がそこまで賢くないって問題は多少あるにせよ、どんだけ生成を賢くしても、この実行時に組むコストがなくせない
  52. }
  53.  
  54. static void 問題_どうせ静的なんだったら()
  55. {
  56. var db = new[] { new { Id = 1, Name = "abc", Description = "some messages" } };
  57.  
  58. // ↓のコードをRoslyn Source Generator に書けた方がいいんじゃない?
  59. // そしたら実行時コスト0なのに。
  60. var q =
  61. from x in db
  62. where x.Id < 100
  63. orderby x.Id
  64. select x.Name;
  65. }
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement