首页 > 解决方案 > 用更少的时间加入两张桌子

问题描述

我有两张桌子TableProjectTableFlag; 我想在一些条件下加入他们。所以首先我从第一个表中获取列表,然后检查第二个表以在 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)。我可以使用存储过程。

标签: c#linqtsql

解决方案


您可以通过连接两个表在数据库上创建一个物化视图,而不仅仅是在您的应用程序中获取视图的结果。如果您有SQL Server 或https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_6002.htm如果您有 ORACLE DB。物化视图比普通视图或仅连接要快得多。


推荐阅读