Skip to content

Instantly share code, notes, and snippets.

@ufcpp
Created August 25, 2016 05:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ufcpp/1b5bdeb90baaa4dbcac6e1ba2317743f to your computer and use it in GitHub Desktop.
Save ufcpp/1b5bdeb90baaa4dbcac6e1ba2317743f to your computer and use it in GitHub Desktop.
静的なのに実行時コストを強いられる
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