2017-02-22 2 views
0

У меня есть простая проблема, но я не могу обернуть вокруг нее голову.Фильтрация объекта, содержащего объекты из другой таблицы с использованием linq C#

У меня есть две таблицы, одна содержит вопросы, ответы. Они сопоставляются друг с другом таким образом, что один вопрос имеет много разрешенных разрешений. EntityFramework обрабатывает это сопоставление очень красиво, поэтому, когда я вызываю контроллер в GetQuestions, я возвращаю прекрасный набор вопросов, содержащих их соответствующие ответы.

Недавно мы расширили систему, включив в этот пример две группы пользователей - A и B. Некоторые вопросы и некоторые ответы действительны только для определенных групп. Таким образом, каждый вопрос имеет свойство showToA showToB - это отлично работает, используя простой запрос linq.where. Однако я не могу понять, как вызвать getQuestions с параметром showToGroupA и вернуть ему вопросы и ответы, ТОЛЬКО относящиеся к указанной группе.

Я по сути хочу иметь возможность получить все соответствующие вопросы и исключить любые нерелевантные ответы.

Любая помощь очень ценится, спасибо.

public class Question 
{ 
    [Key] 
    public int ID { get; set; } 
    public int QID { get; set; } 
    public string question { get; set; } 
    public string type { get; set; } 
    public virtual List<AllowedResponses> AllowedResponse { get; set; } 

    public int PrimaryOrderNo{ get; set; } 
    public int SecondaryOrderNo{ get; set; } 
    public bool ShowToGroupA{ get; set; } 
    public bool ShowToGroupB{ get; set; } 
} 

//Model of allowed responses to questions 
public class AllowedResponses 
{ 
    [Key] 
    public int ID { get; set; } 
    public virtual int QID { get; set; } 
    public string Response { get; set; } 
    public int ResponseID { get; set; } 
    public bool ShowToGroupA { get; set; } 
    public bool ShowToGroupB { get; set; } 
} 

На данный момент я просто возвращает список вопросов, отсортированных по соответствующему порядку, и фильтруется, должен ли вопрос отображаться в группе - НЕ фильтрации AllowedResponses.

List<Questions> Questions = _repo.GetQuestions(); 
     Questions = Questions.OrderBy(x => x.GroupAOrderNo).ToList(); 
     List<Questions> QuestionsFiltered; 
     if (GroupAorB == "A") 
     { 
      QuestionsFiltered = Questions.Where(a => a.ShowToA == true).ToList(); 
     } else 
     { 
      QuestionsFiltered = Questions.Where(a => a.ShowToB == true).ToList(); 
     } 
     return Request.CreateResponse(HttpStatusCode.OK, Questions); 

Пожалуйста, обратите внимание, я упростил здесь код и изменил некоторые имена, извините любой полученный пробой в логике.

+0

Где код, который не работает? –

+1

Итак, если вы правильно поняли, может возникнуть вопрос, который помечен как «ShowToGroupA» с ответом, который помечен как «ShowToGroupB»? – grek40

+0

да, это правильно, потому что вопросы и ответы - это два отдельных объекта. В будущем мы могли бы решить показать различным группам разные вопросы. – anthonyhumphreys

ответ

1

Вы можете отфильтровать свой ответ в новом объекте что-то вроде: -

List<Questions> Questions = _repo.GetQuestions(); 
    Questions = Questions.OrderBy(x => x.GroupAOrderNo).ToList(); 
var FilteredQuestions = 
       Questions.Where(a => GroupAorB == "A" ? a.ShowToGroupA : a.ShowToGroupB).Select(q => new Question 
       { 
        ID = q.ID, 
        AllowedResponse = 
         q.AllowedResponse.Where(r => GroupAorB == "A" ? r.ShowToGroupA : r.ShowToGroupB).ToList() 

       }).ToList(); 
return Request.CreateResponse(HttpStatusCode.OK, Questions); 
+0

Удивительно, большое вам спасибо за ваш ответ – anthonyhumphreys

+1

Рад помочь вам – jitender