LINQ to Entities で実行される SQL(ADO.NET Entity Framework)

LINQ to Entities で内部実行される SQL は、SQL Server に標準で付属のプロファイラー(SQL Server Profiler)ツールを使って確認することができます。


コードが以下の場合(Northwind データベースの Products テーブルをクエリ)は、

        Using ctx As New NorthwindEntities()
            Dim query = From p In ctx.Products _
                        Select p
            For Each p In query
                Console.WriteLine(p.ProductID & ": " & p.ProductName)
            Next
        End Using

内部実行される SQL は、

SELECT 
[Extent1].[ProductID] AS [ProductID], 
[Extent1].[ProductName] AS [ProductName], 
[Extent1].[SupplierID] AS [SupplierID], 
[Extent1].[CategoryID] AS [CategoryID], 
[Extent1].[QuantityPerUnit] AS [QuantityPerUnit], 
[Extent1].[UnitPrice] AS [UnitPrice], 
[Extent1].[UnitsInStock] AS [UnitsInStock], 
[Extent1].[UnitsOnOrder] AS [UnitsOnOrder], 
[Extent1].[ReorderLevel] AS [ReorderLevel], 
[Extent1].[Discontinued] AS [Discontinued]
FROM [dbo].[Products] AS [Extent1]

となり、Products テーブル内のすべての列を取得してしまいます。LINQ to Entities で Select p と列を指定しない場合はこのようになってしまいます。


LINQ to Entities の記述を次のように列を指定するように変更した場合は、

            Dim query = From p In ctx.Products _
                        Select p.ProductID, p.ProductName

内部実行される SQL は、

SELECT 
[Extent1].[ProductID] AS [ProductID], 
[Extent1].[ProductName] AS [ProductName]
FROM [dbo].[Products] AS [Extent1]

となり、指定した列データのみを取得するように変更することができます。


なお、ADO.NET Entity Framework の基本操作については、こちらへ記述しています。
http://d.hatena.ne.jp/matu_tak/20100807/1282067329