你能在linq中评估或等同吗?

时间:2012-09-18 11:12:42

标签: c# linq eval

如果我有一个问题编号列表

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

非常感谢:)

3 个答案:

答案 0 :(得分:3)

可以手动构建一个表达式,该表达式使用Expression中的方法访问必需属性并将其传递给Where(如果结果确实是 IEnumerable代替IQueryable)。

<强> See it in action

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

答案 1 :(得分:1)

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

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

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

在后台,它将创建类似于Jon的答案,即动态创建的Expression,它应该适合大多数LINQ提供者。

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