过滤器对象图的 Linq 查询

Linq query for filter object graph

我有以下实体关系。我想通过传递项目 ID 来过滤资源。

项目Class

public class Project : EntityBase
{
    public Project()
    {
        this.Tasks = new HashSet<Task>();
    }
    [Key]
    public Guid GUID { get; set; }
    public virtual ICollection<Task> Tasks { get; set; }
}

任务class

public class Task : IIdentifier
{
    public Task()
    {
        this.Assignments = new HashSet<Assignment>();
    }

    [Key]
    public Guid GUID { get; set; }

    [ForeignKey("Projects")]
    public Guid? ProjectId { get; set; }
    public virtual Project Projects { get; set; }

    public virtual ICollection<Assignment> Assignments { get; set; }
}

资源class

public class Resource : IIdentifier
{
    public Resource()
    {
        this.Assignments = new HashSet<Assignment>();
    }

     [Key]
    public Guid GUID { get; set; }
    public virtual ICollection<Assignment> Assignments { get; set; }
}

作业class

 public class Assignment : IIdentifier
{
    [Key]
    public Guid GUID { get; set; }

    [ForeignKey("Tasks")]
    public Guid TaskId { get; set; }
    public virtual Task Tasks { get; set; }

    [ForeignKey("Resources")]
    public Guid ResourceId { get; set; }
    public virtual Resource Resources { get; set; }
}

现在想通过Project GUID获取所有资源

public IEnumerable<Resource> GetResourcesForViewsByProjectId(Guid ProjectId)
    {

        var x = from t in Uow.Tasks.GetAll().Where(con => con.ProjectId == ProjectId)
                from a in Uow.Assignments.GetAll().Where(c => c.TaskId == t.GUID)
                from r in Uow.Resources.GetAll()
                          .Where(r => r.Assignments.Where(con => con.ResourceId == r.GUID))
                          .DefaultIfEmpty()
               select r;

        return x;
    }

但这不起作用。有什么建议吗?

您应该可以为此使用 Join 方法。 试试这个:

public IEnumerable<Resource> GetResourcesForViewsByProjectId(Guid ProjectId)
{
    var resources = Uow.Tasks.Join(
            Uow.Assignments,
            task => task.GUID,
                assignment => assignment.TaskId,
                (task, assignment) => new
                {
                    Task = task,
                    Assignment = assignment
                })
            .Join(Uow.Resources,
                j => j.Assignment.ResourceId,
                resource => resource.GUID,
                (j, resource) => new
                {
                    Task = j.Task,
                    Assignment = j.Assignment,
                    Resource = resource
                })
            .Where(j => j.Task.ProjectId == ProjectId)
            .Select(j => j.Resource);

    return resources;
}

作为参考,此处描述了 LINQ 联接功能:https://msdn.microsoft.com/en-us/library/bb669071(v=vs.110).aspx