使用SqlQuery处理存储过程的多个结果

Whe*_*ler 7 c# sql-server stored-procedures entity-framework

我有一个存储过程,它返回一组多个结果(两个表).我这样调用存储过程:

var result = context.Database.SqlQuery<RefererStatisticResult>(
"exec [dbo].[GetReferrer] @StartDate, @EndDate, @Source",
this.CreateInParam("@StartDate", SqlDbType.DateTime, startDate),
this.CreateInParam("@EndDate", SqlDbType.DateTime, endDate),
this.CreateInParam("@Source", SqlDbType.SmallInt, eventSourveVal)).ToArray();
Run Code Online (Sandbox Code Playgroud)

我的RefererStatisticResult包含两个List <>属性,用于结果集,但调用后列表为空.我该如何处理结果集?是否可以使用SqlQuery?

Mat*_*ton 12

DbContext有物化多个结果没有原生支持.但是,通过下拉到ObjectContext并使用该Translate方法将结果复制DbDataReader到域模型中的实体,可以合理地直接实现.

这是一些示例代码.这假设您ReferrerStatisticResult只是两个名为Set1和的列表的容器Set2.显然根据您的实际域模型进行调整.

// Create container ready for the resultsets
var result = new RefererStatisticResult();

using (var myContext = new MyContext())
{
    // Create command from the context in order to execute
    // the `GetReferrer` proc
    var command = myContext.Database.Connection.CreateCommand();
    command.CommandType = System.Data.CommandType.StoredProcedure;
    command.CommandText = "[dbo].[GetReferrer]";
    // add in command parameters
    // (not shown)

    try
    {
        myContext.Connection.Open();
        var reader = command.ExecuteReader();

        // Drop down to the wrapped `ObjectContext` to get access to
        // the `Translate` method
        var objectContext = ((IObjectContextAdapter)myContext).ObjectContext;

        // Read Entity1 from the first resultset
        result.Set1 = objectContext.Translate<Entity1>(reader, "Set1", MergeOptions.AppendOnly);

        // Read Entity2 from the second resultset
        reader.NextResult();
        result.Set2 = objectContext.Translate<Entity2>(reader, "Set2", MergeOptions.AppendOnly);        
    }
    finally
    {
        myContext.Database.Connection.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 要转换非EF模型/实体,请不要指定实体集名称:`var data = objectContext.Translate &lt;CustomEntity&gt;(reader).ToList();` (2认同)