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

のメソッドを使用して必要なプロパティにアクセスする式を手動で作成し、それをExpression渡すことができます(結果が実際にではなく、実際にでWhereある場合は、最初にコンパイルする可能性があり ます)。IEnumerableIQueryable

実際の動作をご覧ください

しかし、なぜあなたはこれをするのですか?アクセスしたい値をコレクションに配置する方が、個々のプロパティに配置するよりもはるかに優れています。おそらく、この問題をまったく解決する必要がないように、モデルを改善する必要がありますか?

于 2012-09-18T11:19:53.127 に答える
1

Dynamic.cs AKA DynamicQuery AKA DynamicExpressionAPIを使用できます

これを使用して、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 に答える