1

如果我有问题编号列表

var questions =  new List<int> { 2, 4, 8 };

是否有可能在 linq 中进行类似操作的查询?

var results = new List<Answer>();

foreach (var qNum in questions)
{
   results.AddRange(Answers.Where(x => eval(x.Question+qNum) == "Yes"));
}

所以这将查找 x.Question2、x.Question4 和 x.Question8 的答案。

附录

目前我正在这样做:

    var questionAnswers = new List<Answer>();
var Q2 = Questions.Where (x => x.MainQ2.ToUpper() == "NO")
    .Select(x => new Answer { QuestionNumber = 2, AnswerText = x.MainTextQ2, User_Id = x.User_Id });

var Q4 = Questions.Where (x => x.MainQ4.ToUpper() == "NO")
    .Select(x => new Answer { QuestionNumber = 4, AnswerText = x.MainTextQ4, User_Id = x.User_Id });

var Q8 = Questions.Where (x => x.MainQ8.ToUpper() == "NO")
    .Select(x => new Answer { QuestionNumber = 8, AnswerText = x.MainTextQ8, User_Id = x.User_Id });

questionAnswers.AddRange(Q2);
questionAnswers.AddRange(Q4);
questionAnswers.AddRange(Q8);

questionAnswers.GroupBy (a => a.QuestionNumber).Dump();


public class Answer
{
    public int QuestionNumber {get;set;}
    public string AnswerText {get;set;}
    public string User_Id {get;set;}
}

非常感谢 :)

4

3 回答 3

3

可以使用 in 的方法手动构建一个访问必要属性的表达式Expression并将其传递给Where(如果 results 确实是 an IEnumerable而不是 an ,则可能首先编译它IQueryable)。

看到它在行动

但你为什么要这样做?将要访问的值放在集合中比将它们放在单独的属性中要好得多。也许您应该改进模型,以便根本不需要解决这个问题?

于 2012-09-18T11:19:53.127 回答
1

您可以使用 Dynamic.cs AKA DynamicQuery AKA Dynamic Expression API

使用它,您可以输入一个字符串来代替 where 表达式:

Answers.Where("Question"+qNum+"=\"Yes\"")

在后台,它将创建类似于 Jon 的答案的东西,即动态创建的表达式,它应该适合大多数 LINQ 提供程序。

于 2012-09-18T12:38:05.113 回答
0

是的,但不是直接!

x.Question应该评估为一个字符串数组,(或者也许IDictionary<int,string>)然后你就可以做到:

var results = new List<Answers>();

foreach (var qNum in questions)
{
   results.AddRange(Answers.Where(x => x.Question[qNum] == "Yes"));
}
于 2012-09-18T11:15:38.787 回答