EF ObjectQuery <t>上下文,参数,连接属性等效于DbSet <t> </t> </t>

时间:2012-02-28 12:07:44

标签: sql-server entity-framework ef-code-first dbcontext

在早期版本的Entity Framework中,我们能够从Context中找到ObjectQuery,以便阅读ParametersConnection等,如下所示:

var query = (ObjectQuery<T>)source;

cmd.Connection = (SqlConnection)((EntityConnection)query.Context.Connection).StoreConnection;
cmd.Parameters.AddRange(
    query.Parameters.Select(x => new SqlParameter(
        x.Name, x.Value ?? DBNull.Value)
    ).ToArray()
);

当我查看DbSet<T>对象时,我无法找到任何相应的内容。我的目的是创建扩展,它将操纵查询并从中获取结果。

以下是一个实例:http://philsversion.com/2011/09/07/async-entity-framework-queries

或者我应该为DbContext课程编写扩展程序并使用Set方法吗?

有什么想法吗?

修改

这是我到目前为止所做的。到目前为止基本实施,但肯定没有准备好生产。对此有何建议?

public static async Task<IEnumerable<T>> QueryAsync<T>(this DbContext @this, System.Linq.Expressions.Expression<Func<T, bool>> predicate = null)
    where T : class {

        var query = (predicate != null) ? @this.Set<T>().Where(predicate) : @this.Set<T>();

        var cmd = new SqlCommand();

        cmd.Connection = (SqlConnection)(@this.Database.Connection);
        cmd.CommandText = query.ToString();

        if (cmd.Connection.State == System.Data.ConnectionState.Closed) { 

            cmd.Connection.ConnectionString = new SqlConnectionStringBuilder(cmd.Connection.ConnectionString) {
                AsynchronousProcessing = true
            }.ToString();

            cmd.Connection.Open();
        }

        cmd.Disposed += (o, e) => {

            cmd.Clone();
        };

        var source = ((IObjectContextAdapter)@this).ObjectContext.Translate<T>(
            await cmd.ExecuteReaderAsync()
        );

        return source;
}

1 个答案:

答案 0 :(得分:2)

这是一个很好的解决方法,虽然我认为你不能使它比你已经拥有的更普遍适用。

要记住的一些事项:
- 取决于EF查询,例如如果您使用的是否包含,则阅读器中返回的列可能与您要传递的类型T中的属性不匹配。
- 根据您是否在模型中具有继承,您传递给翻译的T可能并不总是为返回的每一行实现的正确事项。
- 在ExecuteReaderAsync返回的任务完成后,您仍然必须检索每一行,这取决于查询的执行计划,并且您获得服务器的延迟可能也是阻塞操作。

异步支持不会在5.0中进入EF,但我们与其他团队合作以确保我们拥有.NET 4.5中包含的所有必要构建块,并且该功能在我们的优先级列表中非常高。我鼓励你vote for it in our UserVoice site