如何更有效地编写C#lamba查询

时间:2018-01-31 13:10:58

标签: c# lambda

有没有办法缩短这三个lambda表达式?现在我需要三个步骤才能得到结果。

首先,我查找属于“某人”的所有目标。然后,我在链接表中查找属于这些目标的所有projectId。最终的lambda按其id返回所有项目。

我不禁想到有一种更有效的方法,但我似乎无法找到它......

public async Task<List<Project>> GetProjectsFromSomeone(string someone) {
    var targetIds = from target in Context.Targets
                     where target.Someone.ToLower().Contains(someone.ToLower())
                     select target.Id;

    var projectIds = from pt in Context.ProjectTargets
                 where targetIds.Any(id  => id == pt.TargetId)
                 select pt.ProjectId;

    var projects = from prj in Context.Projects
                where projectIds.Any(id => id == prj.Id)
                select prj;

    return await projects.ToListAsync(); 
}

public class ProjectTarget
{
    public int ProjectId { get; set; }
    public int TargetId { get; set; }

    public Project Project { get; set; }
    public Target Target { get; set; }
}

public class Target
{
    public int Id { get; set; }
    public string Code { get; set; }
    public string Someone { get; set; }
}

public class Project
{
    public int Id { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
}

2 个答案:

答案 0 :(得分:6)

您可以使用Linq joins。 Linq将负责连接和条件。

public async Task<List<Project>> GetProjectsFromSomeone(string someone) 
{    
    var projects = from target in Context.Targets
                join pt in Context.ProjectTargets on target.Id equals pt.TargetId
                join prj in Context.Projects on pt.ProjectId equals prj.Id
                where target.Someone.ToLower().Contains(someone.ToLower())
                select prj;
    return await projects.ToListAsync(); 
}

希望这有帮助!

答案 1 :(得分:1)

我认为您可以使用加入查询。

from P in Context.Projects
join PT in Context.ProjectTargets on P.Id equals PT.id
join T in Context.Targets on PT.TargetId equals T.id
  .Select(m => new
  {
      //select the fields which you want select
  });