如何创建临时表并在与实体框架的相同连接中使用它

本文关键字:框架 连接 实体 何创建 创建 临时表 | 更新日期: 2023-09-27 17:58:32

我正在尝试使用实体框架执行三个原始查询。

第一个查询基本上将创建一个临时表。第二个查询将在临时表上添加索引。最后,第二个查询将连接到临时表到其他表以获得最终数据集。

但每次我运行代码时,都会出现以下错误

无效的#allRecords对象。

以下是我所做的

using (BaseContextdb = new BaseContext())
{
    using (var dbContextTransaction = db.Database.BeginTransaction())
    {
        try
        {
            db.Database.ExecuteSqlCommand("SELECT col1, col2, col3 " +
                                          "INTO #allRecords " +
                                          "FROM someTable " +
                                          "WHERE col5 = 'blab' " +
                                          "CREATE INDEX d ON #allRecords(col1, col2); ");
            var results = db.Database.SqlQuery<ResuleModel>(this.GetQuery()).ToList();
            db.SaveChanges();
            dbContextTransaction.Commit();
        }
        catch (Exception)
        {
            dbContextTransaction.Rollback();
        }
    }
}

如何使用实体框架正确创建临时表?

更新

以下是this.GetQuery() 返回的查询

SELECT b.*, c.* 
FROM b
INNER JOIN #allRecords AS a ON a.col1 = v.col1 AND a.col2 = b.col2
INNER JOIN c ON c.Id= b.Id
...
...
...

如何创建临时表并在与实体框架的相同连接中使用它

Entity Framework不能很好地处理临时表。

相反,你可能想看看Dapper。它要干净得多;此外,您可以在同一项目中并行使用EF和Dapper。例如,

using (IDbConnection conn = new SqlConnection(DataBaseConnectionString))
{
   conn.Open();
   // If you want transaction, place it inside the query. 
   var entities = conn.Query<ResuleModel>(@"SELECT col1, col2, col3 ...");
   result = entities.ToList();
}

仅供参考:在Dapper中使用查询之前,请确保在SSMS中执行查询

在创建、插入或查询临时表之前,需要Open一个新连接
在上下文处理之前,打开的连接不会自动关闭。

db.Database.Connection.Open();