.NET Framework 3.5、C#3.0
匿名メソッドとラムダを「ただシンタックスが違うだけ」と考えているとエライ目にあう。
SQL Server 2005 のサンプルデータベース「AdventureWorks」を使って、匿名メソッドとラムダ、ついでに LINQ による LINQ to SQL で検証する(匿名メソッドとラムダを使った場合に LINQ to SQL と表現するのは微妙だけど)。
匿名メソッド
AdventureWorksDataContext adventureWorks = new AdventureWorksDataContext();
var query = adventureWorks.Address.
Where(delegate(Address address) { return address.City == "Bothell"; }).
Select(delegate(Address address) { return address.AddressID; });
ラムダ
AdventureWorksDataContext adventureWorks = new AdventureWorksDataContext();
var query = adventureWorks.Address.
Where(address => address.City == "Bothell").
Select(addres => addres.AddressID);
LINQ
AdventureWorksDataContext adventureWorks = new AdventureWorksDataContext();
var query = from address in adventureWorks.Address
where address.City == "Bothell"
select address.AddressID;
上記 3 つは書き方が違うだけで、処理は同じ事をしている。簡単な例なので説明は不要だろう。
結果は全く同じになるが、大きな違いが一つある。匿名メソッドの例は非常にパフォーマンスが悪いのだ。実際に発行される SQL を見てみよう。
匿名メソッド
SELECT
[t0].[AddressID],
[t0].[AddressLine1],
[t0].[AddressLine2],
[t0].[City],
[t0].[StateProvinceID],
[t0].[PostalCode],
[t0].[rowguid],
[t0].[ModifiedDate]
FROM [Person].[Address] AS [t0]
ラムダ、LINQ
exec sp_executesql N'
SELECT
[t0].[AddressID]
FROM [Person].[Address] AS [t0]
WHERE [t0].[City] = @p0',N'@p0 nvarchar(7)',@p0=N'Bothell'
違いは一目瞭然。 匿名メソッドはアホ過ぎるクエリを発行している。何故だろうか。
つづく。