Created
August 25, 2016 05:52
-
-
Save ufcpp/1b5bdeb90baaa4dbcac6e1ba2317743f to your computer and use it in GitHub Desktop.
静的なのに実行時コストを強いられる
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment