2015-08-05 3 views
1

У меня есть следующие отношения entitiy. Я хочу фильтровать ресурсы, передавая идентификатор проекта.Запрос Linq для фильтра объекта graph

Класс проекта

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

класс Task

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; } 
} 

класс ресурсов

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

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

Назначение класса

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; } 
} 

Теперь я хочу, чтобы получить все ресурсы, когда я прохожу проект 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; 
    } 

, но это не работает. Какие-либо предложения?

ответ

1

Для этого вы должны использовать метод 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

+0

Просто заметил, что вы используете метод с GETALL() - может возникнуть необходимость лавировать, что на конце UOW. Задачи, Uow.Assignments и Uow.Resources. Я обновлю свой пример, если это так. –

+0

Его работы отлично. спасибо –