如何在同一连接中使用Entity Framework创建临时表并使用它?

7

我正在试图使用Entity Framework执行三个原始查询。

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

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

无效的#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();
        }
    }
}

如何使用 Entity Framework 正确创建临时表?

更新

这是由 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
...
...
...

尝试在类上使用Table属性,如[Table("#allRecords")] public class ResuleModel{}... - Alex Krupka
我在哪里会用到那个? - Jaylen
请参考ResuleModule类的https://dev59.com/KWIj5IYBdhLWcg3whFUI第二个答案中的示例。并且我选择该链接并没有特定的原因,可能只是因为当我谷歌搜索Table属性用法示例时它首先出现了。 - Alex Krupka
如果我没有使用连接,那么这将起作用。方法this.GetQuery()返回一个复杂的查询。我会更新我的问题,说明this.GetQuery()返回什么。 - Jaylen
为什么不把临时表和查询放在同一条语句中?(我在使用 Dapper 时遇到了类似的问题,只需将语句合并即可) - Alex Krupka
2个回答

4

实体框架与临时表不兼容。

相反,您可能希望查看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中执行了该查询。


https://www.google.com/search?q=what%20is%20SSMS - Win

1

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

db.Database.Connection.Open();

db.Database.OpenConnection() 在 EF Core 2.2 中可用。最好将此代码包装在 IDisposable 中,并在最后执行 db.Database.CloseConnection() - AndriiL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接