在实体框架查询中引用临时表

wez*_*ten 5 c# sql sql-server entity-framework

内存中有一个包含50,000 个产品 ID 的列表。我想从数据库获取所有这些产品。使用dbContext.Products.Where(p => list.contains(p.ID))在 SQL 中生成一个巨大的 IN - WHERE ID IN (2134,1324543,5675,32451,45735...),并且需要很长时间。部分原因是SQL Server解析这么大的字符串需要时间,而且执行计划也很糟糕。(我通过尝试使用临时表知道这一点)。

所以我使用 SQLBulkCopy 将 ID 插入到临时表中,然后运行

dbContext.Set<Product>().SqlQuery("SELECT * FROM Products WHERE ID IN (SELECT ID FROM #tmp))"
Run Code Online (Sandbox Code Playgroud)

这提供了良好的性能。但是,现在我需要产品及其供应商(每种产品有多个)。使用自定义 SQL 命令无法取回我所知道的复杂对象。那么我如何使用临时表从供应商那里获取产品呢?

(如果我可以以某种方式引用 LINQ 中的临时表,那么就可以了 - 我可以这样做dbContext.Products.Where(p => dbContext.TempTable.Any(t => t.ID==p.ID))。如果我可以在 UDF 中引用它,那也很好 - 但你不能。我不能使用真正的表,因为并发用户会使它处于不一致的状态。)

谢谢

quj*_*jck 1

我建议您扩展过滤器表(TempTable在上面的代码中)来存储类似UserIdorSessionId的内容ProductID's

  • 这将为您提供您想要的所有性能
  • 它将适用于并发用户

如果此过滤表变化很大,请考虑在单独的事务(即 的不同实例dbContext)中更新它,以避免在此表上持有写锁的时间超过必要的时间。