簡體   English   中英

如何使Entity Framework映射成為DbDataReader?

[英]How can I make Entity Framework map a DbDataReader?

我試圖使Entity Framework返回多個自定義查詢結果,然后將其映射回Entity Framework Code First模型。 是否可以使用Entity Framework的內部映射引擎?

我可以保證結果集中兩個查詢返回的行都直接映射到EF模型。 作為內部要求,我不能使用存儲過程。

public void MultipleResultSets()
{
    var db = new DbContext();
    var command = db.Database.Connection.CreateCommand();
    command.Connection.Open();
    command.CommandText =
        @"
        SELECT * FROM TableA; 
        SELECT * FROM TableB;
        ";

    using (var reader = command.ExecuteReader())
    {
        // Map Table A rows
        var tableARows = new List<TableARow>();
        while (reader.Read())
            tableARows.Add(reader.Map<TablARow>()); // "Map()" is not real

        reader.NextResult();

        // Map Table B rows
        var tableBRows = new List<TableBRow>();
        while (reader.Read())
            tableARows.Add(reader.Map<TablBRow>()); // "Map()" is not real
    }
    command.Connection.Close();
}

免責聲明 :我是EF +項目的所有者。

您可以從我的存儲庫中找到一種擴展方法,該方法使用內部映射引擎映射數據讀取器。

public static IEnumerable<T> MapReader<T>(this DbContext context, DbDataReader reader) where T : class
{
    return ((IObjectContextAdapter) context).ObjectContext.Translate<T>(reader);    
}

然后,您可以像下面這樣使用代碼:

public void MultipleResultSets()
{
    var db = new DbContext();
    var command = db.Database.Connection.CreateCommand();
    command.Connection.Open();
    command.CommandText =
        @"
        SELECT * FROM TableA; 
        SELECT * FROM TableB;
        ";

    using (var reader = command.ExecuteReader())
    {
        // Map Table A rows
        var tableARows = db.MapReader<TableA>(reader);

        reader.NextResult();

        // Map Table B rows
        var tableBRows = db.MapReader<TableB>(reader);
    }
    command.Connection.Close();
}

注意 :擴展方法已更新為使用Pawel答案“ ObjectContext.Translate”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM