鉴于 a)已完成调查的长列表,其中完成的调查仅为
形式的(~100)答案列表。和 b)一个过滤调查,其中一些答案已经预先选定(例如“女性”,“吸烟者”),我如何获得满足定义的标准的已完成调查的子集在过滤调查中?
编辑: 这些是相关的类:
public class Answer
{
public int Id { get; set; }
public Question Question { get; set; }
public List<AnswerPossibility> SelectedAnswers { get; set; }
}
public class Survey
{
public int Id { get; set; }
public string Title { get; set; }
public List<Question> Questions { get; set; }
}
public class CompletedSurvey
{
public int Id { get; set; }
public Survey Survey { get; set; }
public List<Answer> Answers { get; set; }
}
public class Subset
{
// used to define a filter criteria
public int Id { get; set; }
public Survey Survey { get; set; }
public List<Answer> Answers { get; set; }
public string Title { get; set; }
}
public class Question
{
public int Id { get; set; }
public string Text { get; set; }
public QuestionType QuestionType { get; set; }
public List<AnswerPossibility> AnswerPossibilities { get; set; }
}
到目前为止,我还没有提出可编译的东西:o(
哦,伙计,John Skeet对我的问题进行了低估。就是这样,我完成了编程......(开玩笑^^,我刚刚开始......)
答案 0 :(得分:1)
假设存在,
CompletedSurvey key
,其中描述了&#34;过滤器调查&#34;你提到的IEnumerable<CompletedSurvey> answers
,描述了人们的实际答案然后你可以做这样的事情,
return answers.Select(survey => survey.Answers.Join(key.Answers,
a => a.Question.Id,
b => b.Question.Id,
(a, b) => new {
answer = a,
expected = b
}))
.Where(c => c.All(x => x.expected.SelectedAnswers
.GroupJoin(x.answer.SelectedAnswers,
a => a.Id,
b => b.Id,
(a, b) => b.Any())));
这是完全未经测试的,我在答案框中写了这个,所以可能不对。您也可以清理它。但它应该让你开始。
我们的想法是完成已完成的调查,其中包含密钥中列出的答案(通过联接),然后仅采用那些包含密钥中存在的所有选定答案的调查(通过该组加入)。这是一种非常复杂的方式,我怀疑这是一个更好的方法,但这是我从你给我们的东西中得出的。