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 中引用它,那也很好 - 但你不能。我不能使用真正的表,因为并发用户会使它处于不一致的状态。)
谢谢
我建议您扩展过滤器表(TempTable在上面的代码中)来存储类似UserIdorSessionId的内容ProductID's:
如果此过滤表变化很大,请考虑在单独的事务(即 的不同实例dbContext)中更新它,以避免在此表上持有写锁的时间超过必要的时间。
| 归档时间: |
|
| 查看次数: |
7662 次 |
| 最近记录: |