生 SQL クエリRaw SQL Queries

Entity Framework エンティティ クラスで LINQ を使用してクエリを実行することができます。Entity Framework allows you to query using LINQ with your entity classes. ただし、データベースに対して直接 SQL そのものを使用してクエリを実行する時間があります。However, there may be times that you want to run queries using raw SQL directly against the database. これは、Code First モデルの現在のストアド プロシージャへのマッピングをサポートしていないことができますが、ストアド プロシージャの呼び出しが含まれます。This includes calling stored procedures, which can be helpful for Code First models that currently do not support mapping to stored procedures. このトピックで紹介するテクニックは、Code First および EF Designer で作成されたモデルに等しく使用できます。The techniques shown in this topic apply equally to models created with Code First and the EF Designer.

エンティティの SQL クエリの記述Writing SQL queries for entities

DbSet に SqlQuery メソッドは、エンティティのインスタンスを返す書き込まれる生 SQL クエリを使用します。The SqlQuery method on DbSet allows a raw SQL query to be written that will return entity instances. れる LINQ クエリが返されたかどうかと同様、返されたオブジェクトがコンテキストによって追跡されます。The returned objects will be tracked by the context just as they would be if they were returned by a LINQ query. 例えば:For example:

using (var context = new BloggingContext())
{
    var blogs = context.Blogs.SqlQuery("SELECT * FROM dbo.Blogs").ToList();
}

LINQ クエリと同様、クエリが実行されない結果が列挙されるまでに注意してください: ToList への呼び出しで上記の例で実行されます。Note that, just as for LINQ queries, the query is not executed until the results are enumerated—in the example above this is done with the call to ToList.

生 SQL クエリが 2 つの理由に書き込まれるたびに、十分に注意してください。Care should be taken whenever raw SQL queries are written for two reasons. 最初に、実際には、要求された型のエンティティのみが返されることを確認するクエリを記述する必要があります。First, the query should be written to ensure that it only returns entities that are really of the requested type. たとえば、継承などの機能を使用する場合が正しくない CLR 型のエンティティを作成するクエリを記述する簡単です。For example, when using features such as inheritance it is easy to write a query that will create entities that are of the wrong CLR type.

次に、生の SQL クエリの種類によっては、SQL インジェクション攻撃の特にの潜在的なセキュリティ リスクを公開します。Second, some types of raw SQL query expose potential security risks, especially around SQL injection attacks. このような攻撃から保護するための適切な方法で、クエリでパラメーターを使用することを確認します。Make sure that you use parameters in your query in the correct way to guard against such attacks.

ストアド プロシージャからのエンティティの読み込みLoading entities from stored procedures

DbSet.SqlQuery を使用して、ストアド プロシージャの結果からエンティティを読み込むことができます。You can use DbSet.SqlQuery to load entities from the results of a stored procedure. たとえば、次のコードは、dbo を呼び出します。データベースの GetBlogs プロシージャ:For example, the following code calls the dbo.GetBlogs procedure in the database:

using (var context = new BloggingContext())
{
    var blogs = context.Blogs.SqlQuery("dbo.GetBlogs").ToList();
}

次の構文を使用してストアド プロシージャにパラメーターを渡すこともできます。You can also pass parameters to a stored procedure using the following syntax:

using (var context = new BloggingContext())
{
    var blogId = 1;

    var blogs = context.Blogs.SqlQuery("dbo.GetBlogById @p0", blogId).Single();
}

エンティティ型以外の SQL クエリの作成Writing SQL queries for non-entity types

データベース クラスの SqlQuery メソッドを使用して、プリミティブ型を含む、任意の型のインスタンスを返す SQL クエリを作成できます。A SQL query returning instances of any type, including primitive types, can be created using the SqlQuery method on the Database class. 例えば:For example:

using (var context = new BloggingContext())
{
    var blogNames = context.Database.SqlQuery<string>(
                       "SELECT Name FROM dbo.Blogs").ToList();
}

オブジェクトのエンティティ型のインスタンスである場合でも、データベースで SqlQuery から返される結果は、コンテキストによって追跡ことはありません。The results returned from SqlQuery on Database will never be tracked by the context even if the objects are instances of an entity type.

生のコマンドをデータベースに送信します。Sending raw commands to the database

非クエリ コマンドは、データベースで ExecuteSqlCommand メソッドを使用してデータベースに送信できます。Non-query commands can be sent to the database using the ExecuteSqlCommand method on Database. 例えば:For example:

using (var context = new BloggingContext())
{
    context.Database.ExecuteSqlCommand(
        "UPDATE dbo.Blogs SET Name = 'Another Name' WHERE BlogId = 1");
}

エンティティが読み込まれたまたは、データベースから再読み込みされるまで ExecuteSqlCommand を使用して、データベース内のデータに加えられた変更は、コンテキストに不透明なことに注意してください。Note that any changes made to data in the database using ExecuteSqlCommand are opaque to the context until entities are loaded or reloaded from the database.

出力パラメーターOutput Parameters

出力パラメーターを使用している場合は、結果が完全に読み取られるまでに、その値は使用できません。If output parameters are used, their values will not be available until the results have been read completely. これは、DbDataReader の基になる動作によるものを参照してくださいDataReader によるデータの取得の詳細。This is due to the underlying behavior of DbDataReader, see Retrieving Data Using a DataReader for more details.