web-dev-qa-db-ja.com

Entity Framework 4を使用しているときにデータリーダーを返すにはどうすればよいですか?

LINQとEntityFrameworkコンテキストを使用してデータベースクエリを定義したいのですが、エンティティを返したくありません。データリーダーが欲しい!

これどうやってするの?これは、行をCSVにエクスポートするためのものです。

乾杯、イアン。

15
Ian Warburton

この質問はEF4に関するものですが、EF 6以上を使用している他の人は、AsStreaming()拡張メソッドを使用できます。

http://msdn.Microsoft.com/en-us/library/dn237204(v = vs.113).aspx

6
jhilden

これが必要な場合は、おそらく予期しないことをしているでしょう。クエリの具体化された結果を介した単純な反復は、必要なものである必要があります。つまり、ORMの方法です。気に入らない場合は、SqlCommandを直接使用してください。

DbContext APIは単純化されているため、ObjectContextAPIで使用できる多くの機能が含まれていません。データリーダーへのアクセスはその1つです。 DbContextObjectContextに変換して、より複雑なAPIを使用することができます。

ObjectContext objContext = ((IObjectContextAdapter)dbContext).ObjectContext;
using (var connection = objContext.Connection as EntityConnection)
{
    // Create Entity SQL command querying conceptual model hidden behind your code-first mapping
    EntityCommand command = connection.CreateCommand();
    command.CommandText = "SELECT VALUE entity FROM ContextName.DbSetName AS entity";
    connection.Open();
    using (EntityDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess))
    {
        ...
    }
}

ただし、前者の例でもクエリからSQLクエリへのマッピングを使用しているため、純粋なADO.NETの方法ははるかに簡単で高速です。

using (var connection = new SqlConnection(Database.Connection.ConnectionString))
{
    SqlCommand command = connection.CreateCommand();
    command.CommandText = "SELECT * FROM DbSetName";
    connection.Open();
    using(SqlDataReader reader = command.ExecuteReader())
    {

    }
}
19
Ladislav Mrnka