Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Linq;
- class Program
- {
- static void 要件()
- {
- var db = new[] { new { Id = 1, Name = "abc" } };
- var q =
- from x in db
- where x.Id < 100
- orderby x.Id
- select x.Name;
- // ↓最終的にこうなってほしい
- db.Query(@"
- SELECT Name FROM [table name]
- WHERE Id < 100
- ORDER BY Id
- ");
- }
- static void 問題_式ツリーは静的()
- {
- var db = new[] { new { Id = 1, Name = "abc", Description = "some messages" } };
- // これは、コンパイル時に確定してるもので、
- // コンパイル結果は固定的。実行時変更書けることできない
- var q =
- from x in db
- where x.Id < 100
- orderby x.Id
- select x.Name;
- // 例えば、Name 固定じゃなく、Name か Description かをユーザー入力で分岐、みたいなことは無理
- // 以下、疑似コード。コンパイル不可
- var selectedMember = Console.ReadLine() == "Name" ? x.Name : x.Description;
- var q =
- from x in db
- where x.Id < 100
- orderby x.Id
- select selectedMember;
- // だったら、実行時に何か処理するの無駄じゃない?
- // db.Query 作るのになんで、実行時に Expression を走査して SQL 組まなきゃいけないの?
- // 実際、LINQ to Entities のパフォーマンス悪い!って言われてる理由の何割かはこのせい。
- // 生成される SQL がそこまで賢くないって問題は多少あるにせよ、どんだけ生成を賢くしても、この実行時に組むコストがなくせない
- }
- static void 問題_どうせ静的なんだったら()
- {
- var db = new[] { new { Id = 1, Name = "abc", Description = "some messages" } };
- // ↓のコードをRoslyn Source Generator に書けた方がいいんじゃない?
- // そしたら実行時コスト0なのに。
- var q =
- from x in db
- where x.Id < 100
- orderby x.Id
- select x.Name;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement