C# 你能在linq中评估或等效吗?

C# 你能在linq中评估或等效吗?,c#,linq,eval,C#,Linq,Eval,如果我有一个问题编号列表 var questions = new List<int> { 2, 4, 8 }; var-questions=新列表{2,4,8}; 在linq中有可能有这样的查询吗 var results = new List<Answer>(); foreach (var qNum in questions) { results.AddRange(Answers.Where(x => eval(x.Question+qNum) ==

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

var questions =  new List<int> { 2, 4, 8 };
var-questions=新列表{2,4,8};
在linq中有可能有这样的查询吗

var results = new List<Answer>();

foreach (var qNum in questions)
{
   results.AddRange(Answers.Where(x => eval(x.Question+qNum) == "Yes"));
}
var results=newlist();
foreach(问题中的var qNum)
{
results.AddRange(答案,其中(x=>eval(x.Question+qNum)==“Yes”);
}
这将查找问题2、问题4和问题8的答案

补遗 目前我正在这样做:

    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;}
}
var questionAnswers=新列表();
var Q2=问题。其中(x=>x.MainQ2.ToUpper()==“否”)
.Select(x=>新答案{QuestionNumber=2,AnswerText=x.MainTextQ2,User\u Id=x.User\u Id});
var Q4=问题。其中(x=>x.MainQ4.ToUpper()==“否”)
.Select(x=>新答案{QuestionNumber=4,AnswerText=x.MainTextQ4,User\u Id=x.User\u Id});
var Q8=问题。其中(x=>x.MainQ8.ToUpper()==“否”)
.Select(x=>新答案{QuestionNumber=8,AnswerText=x.MainTextQ8,User\u Id=x.User\u Id});
问题答案。添加范围(Q2);
问题答案。添加范围(第四季度);
问题答案。添加范围(Q8);
questionAnswers.GroupBy(a=>a.QuestionNumber.Dump();
公开课答案
{
公共整数问题编号{get;set;}
公共字符串应答文本{get;set;}
公共字符串用户_Id{get;set;}
}
非常感谢:)

是的,但不是直接的

x.Question
应计算为字符串数组(或者可能是
IDictionary
),然后您可以执行以下操作:

var results = new List<Answers>();

foreach (var qNum in questions)
{
   results.AddRange(Answers.Where(x => x.Question[qNum] == "Yes"));
}
var results=newlist();
foreach(问题中的var qNum)
{
results.AddRange(答案.Where(x=>x.Question[qNum]==“Yes”);
}
是的,但不是直接的

x.Question
应计算为字符串数组(或者可能是
IDictionary
),然后您可以执行以下操作:

var results = new List<Answers>();

foreach (var qNum in questions)
{
   results.AddRange(Answers.Where(x => x.Question[qNum] == "Yes"));
}
var results=newlist();
foreach(问题中的var qNum)
{
results.AddRange(答案.Where(x=>x.Question[qNum]==“Yes”);
}
您可以使用中的方法手动构建访问必需属性的表达式,并将其传递到
中的
(如果结果确实为
IEnumerable
而不是
IQueryable

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

您可以使用中的方法手动构建一个访问必需属性的表达式,并将其传递到
,其中
(如果结果确实是错误的,则可能先编译它)
IEnumerable
而不是
IQueryable


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

您可以使用Dynamic.cs AKA DynamicQuery AKA

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

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

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

您可以使用Dynamic.cs AKA DynamicQuery AKA

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

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

在后台,它将创建类似于Jon答案的内容,即动态创建的表达式,应该适用于大多数LINQ提供者。

我不明白
eval
在这里应该做什么。eval将在第一个循环中计算属性名称,这将是“x.Question2”,然后是“x.Question4”答案在数据库中是一个非常糟糕的表,我必须对其进行一些报告,它有一些字段,如Question1Answer、Question2Answer等。。。我只需要报告几个选择的问题,其中答案是否定的。添加了真实的实现来解释我为什么要做这件可怕的事情:)您是否使用LINQ来创建对象,Linq到SQL或实体框架?我不明白
eval
在这里应该做什么。eval将在第一个循环中计算属性名称这将是“x.Question2”,然后“x.Question4”回答是数据库中一个非常糟糕的表,我必须对其进行一些报告,它有类似Question1Answer的字段,问题2答案等。。。我只需要报告几个选择的问题,答案是否定的。添加了真实的实现来解释我为什么要做这件可怕的事情:)你是在使用LINQ到对象、LINQ到SQL还是实体框架?我继承了一个设计糟糕的数据库,需要对其进行一些报告。我的实现一点也不枯燥(见附录),我想回到我编写ActionScript的时候,在那里我可以“评估”变量名,我想知道我是否可以在这里做同样的事情。@Kohan:我添加了一个实例来演示。在
IQueryable
(不要调用
Compile()
,使用
表达式而不是
Func
)上运行它需要做一些小的更改。有趣的是,我不想这样做,但正如您已经证明的那样:)我继承了一个设计糟糕的数据库,需要对其进行一些报告。我的实现一点也不枯燥(见附录),我想回到我编写ActionScript的时候,在那里我可以“评估”变量名,我想知道我是否可以在这里做同样的事情。@Kohan:我添加了一个实例来演示。在
IQueryable
(不要调用
Compile()
,使用
表达式而不是
Func
)上运行它需要做一些小的更改。有趣的是,我不想这样做,但正如您已经证明的那样:)