如何创建临时表并在与实体框架的相同连接中使用它
本文关键字:框架 连接 实体 何创建 创建 临时表 | 更新日期: 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();