c# - 用更少的时间加入两张桌子
问题描述
我有两张桌子TableProject
和TableFlag
; 我想在一些条件下加入他们。所以首先我从第一个表中获取列表,然后检查第二个表以在 for 循环中找到正确的值。
虽然它可以工作,但速度很慢,大约需要 10 秒。
// Step 1 get the list from the first table
var temp = Task.FromResult(await myDatabase.TableProject.
Select(p => new ProjectDto
{
Id = p.Id,
Name = p.Name,
Type = p.Type,
Status = p.Status
})
.Where(x => x.Type != 999)
.Orderby(y => y.Name).ToListAsync());
var list = temp.Result;
// Step 2 check the second table to find right values in a for loop.
for(int i = 0; i < list.Count; i++)
{
if(list[i].Type.HasValue)
{
list[i].ProjectType = (from f in myDatabase.TableFlag
where f.FlagName == "PROJECT TYPE" && f.FlagId == list[i].Type
select f.FlagValue).FirstOrDefaut();
}
if(list[i].Type.HasValue)
{
list[i].Status = (from f in myDatabase.TableFlag
where f.FlagName == "PROJECT STATUS" && f.FlagId == list[i].Status
select f.FlagValue).FirstOrDefaut();
}
}
return Json(list);
如果您查看第 2 步,则需要 o(n^2) 时间。
更新:
欢迎使用 SQL 查询(T-SQL)。我可以使用存储过程。
解决方案
您可以通过连接两个表在数据库上创建一个物化视图,而不仅仅是在您的应用程序中获取视图的结果。如果您有SQL Server 或https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_6002.htm如果您有 ORACLE DB。物化视图比普通视图或仅连接要快得多。
推荐阅读
- linux - 是否可以更换实时安装的 BTRFS RAID 上的驱动器?
- c# - 使用 Microsoft.OData.Client 为导航属性和子类创建 OData 查询 URL
- javascript - Browsersync IDE 错误“无法打开浏览器(如果您在无头环境中使用 BrowserSync,您可能需要将打开选项设置为 false)”
- c++ - 如何在测验中有效地使用 struct?
- angular - Crud angular使用表格和来自角度材料的对话框
- php - 如何在 WordPress 中使 HTML 元素不在循环内循环
- javascript - 如何构建 docker 容器端口?使用--net 还是--link?
- c# - Microsoft Graph API/SDK 在 generalException 中获取 DriveItem 流结果
- sqlite - 在 C 代码中返回 expr 不适用于 sqlite3_exec()
- python - OpenGL 无法正确渲染正方形