sql-server - EF ObjectQuery<T> 上下文、参数、连接属性等效于 DbSet<T>

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

在 Entity Framework 的早期版本中,我们能够访问 ContextObjectQuery为了阅读Parameters , Connection等如下:

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;
}

最佳答案

这是一个很好的解决方法,尽管我认为您无法使其比您已有的更普遍适用。

需要记住的一些事情:
- 取决于 EF 查询,例如无论您是否使用 Include,读取器中返回的列可能与您传递的类型 T 中的属性不匹配。
- 根据您的模型中是否具有继承,您传递给翻译的 T 可能并不总是适合为返回的每一行具体化。
- ExecuteReaderAsync 返回的任务完成后,您仍然必须检索每一行,这取决于查询的执行计划以及您在服务器上获得的延迟也可能是阻塞操作。

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

关于sql-server - EF ObjectQuery<T> 上下文、参数、连接属性等效于 DbSet<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9481619/

相关文章:

c# - Entity Framework 根据输入参数动态查询表名

c# - 不确定如何解决 'Unable to determine the principal end of an association' 错误

sql - 如何使用 SQL 在单个表中更新多行?

c# - 将 EF6 存储函数用于 Entity Framework 代码优先,我可以返回自定义类型吗?

c# - 无法使用 SetModelValue 修改 ModelState

wpf - 使用迁移到 LocalDB 的 CodeFirst,我可以指定*在哪里*创建数据库吗?

entity-framework-4 - Entity Framework 4 代码优先 : Where is my database?

sql-server - Biztalk 适配器包安装 - 没有看到 WCF-SQL 适配器

sql - 如何有效地连接多个表中的多行

sql-server - 使用存储过程从 vb.net 传递参数