C# 用更少的时间连接两个表

C# 用更少的时间连接两个表,c#,linq,tsql,C#,Linq,Tsql,我有两个表TableProject和TableFlag;我想带着一些条件加入他们。 首先,我从第一个表中得到列表,然后检查第二个表,在for循环中找到合适的值 虽然它可以工作,但速度相当慢,大约需要10秒 // Step 1 get the list from the first table var temp = Task.FromResult(await myDatabase.TableProject. Select(p => new ProjectDto

我有两个表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,它需要^2次

更新:


Sql查询Sql是受欢迎的。我可以使用存储过程。

通过连接两个表,您可以在数据库上创建一个物化视图,而不仅仅是在应用程序中获取视图的结果。如果您有SQL Server或ORACLE DB,请使用。物化视图比普通视图或仅连接要快得多。

如果使用“let”子句,它们将被转换为数据库中的连接或子查询。这将减少数据库的往返次数,并且查询将运行得更快

var query =
  from project in myDatabase.TableProject
  where project.Type != 999
  order by project.Name
  let statusFlag = myDatabase.TableFlag
    .FirstOrDefault(f => f.FlagName == "PROJECT STATUS" && f.FlagId == project.Status)
  let typeFlag = myDatabase.TableFlag
    .FirstOrDefault(f => f.FlagName == "PROJECT TYPE" && f.FlagId == project.Type)
  select new ProjectDto {
    Id = project.Id,
    Name = project.Name,
    Type = project.Type,
    Status = statusFlag?.FlagValue,
    ProjectType = typeFlag?.FlagValue
  };

把C代码放到一边。假设您必须使用SQL编写此代码。那个查询会是什么样子?@mjwills,说得对。事实上,我不知道如何为此编写SQL查询。好的,谢谢您的输入。但是我不想创建视图,因为我没有权限。