使用linq c#

时间:2017-02-22 11:59:42

标签: c# entity-framework linq

我有一个看似简单的问题,但无法绕过它。

我有两个表,一个包含问题,一个包含回复。它们被映射在一起,使得一个问题具有许多allowedResponses。 EntityFramework非常好地处理这个映射,所以当我把控制器调用到GetQuestions时,我会回到一个包含相关响应的一组很好的问题。

我们最近将系统扩展为包括两个用户组 - 在此示例中为A和B.有些问题和一些回复仅对某些群体有效。所以每个问题都有一个showToA showToB属性 - 使用简单的linq.where查询可以正常工作。但是我无法弄清楚如何使用参数showToGroupA调用getQuestions并让它返回仅与指定组相关的问题和响应。

我基本上希望能够获得所有相关问题,并删除任何不相关的回复。

非常感谢任何帮助,谢谢。

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

请注意我在这里简化了代码并更改了一些名称,请原谅任何由此产生的逻辑细分。

1 个答案:

答案 0 :(得分: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);