C# 如何使用for循环创建动态查询?

C# 如何使用for循环创建动态查询?,c#,linq,visual-studio-2010,C#,Linq,Visual Studio 2010,我想根据输入的数字动态创建查询,并将其设置为数组以从视图中获取数据,这样我就可以创建条件对其进行过滤,但我的查询仅适用于输入的3数字 var query = from bs in dc.VwResourceAssignments select bs; var listReqNumber = new[] {123, 456, 789}; 我目前的查询是: if (listReqNumber.Length == 1) { query = query.Where(p => p.Req

我想根据输入的数字动态创建查询,并将其设置为数组以从视图中获取数据,这样我就可以创建条件对其进行过滤,但我的查询仅适用于输入的3数字

var query = from bs in dc.VwResourceAssignments select bs;

var listReqNumber = new[] {123, 456, 789};
我目前的查询是:

if (listReqNumber.Length == 1)
{
    query = query.Where(p => p.RequisitionNumber.Contains(listReqNumber[0]));
}
else if (listReqNumber.Length == 2)
{
    query = query.Where(p => p.RequisitionNumber.Contains(listReqNumber[0]) ||
                             p.RequisitionNumber.Contains(listReqNumber[1]));
}
else if (listReqNumber.Length == 3)
{
    query = query.Where(p => p.RequisitionNumber.Contains(listReqNumber[0]) ||
                             p.RequisitionNumber.Contains(listReqNumber[1]) ||
                             p.RequisitionNumber.Contains(listReqNumber[2]));
}

有没有什么方法可以动态设置,以便我可以输入任意数量的请购单编号?

如果您直接这样使用:

var result = from p in query where listReqNumber.Contains(p.RequisitionNumber) select p;
var data=query.Where(q=>
q、 requisionnumber.Any(w=>listReqNumber.Contains(w))
);

您可以使用动态linq。链接如下:

然后使用如下函数:

string GetQuery(int num)
{
    return $"p.RequisitionNumber.Contains(listReqNumber[{num}])";
}
在Main中创建一个查询,如下所示:

string testQuery = string.Empty; // or use StringBuilder then convert to string.
int length = 4;
for (int temp = 1; temp <= length; temp ++)
     testQuery += testQuery.Length == 0 ? GetQuery(temp - 1) : " || " + GetQuery(temp);
让我们概括一下这个问题:如果我们有一个任意的
listReqNumber
数组,我们就要实现它

query = query.Where(
   p => p.RequisitionNumber.Contains(listReqNumber[0]) ||
        p.RequisitionNumber.Contains(listReqNumber[1]) || 
        ...
        p.RequisitionNumber.Contains(listReqNumber[listReqNumber.Length - 1])
);
或者-让我们去掉
|
-我们希望
任何
项目
req
中包含
列表需求编号
p.requisionnumber

 // doesn't compile - just the idea   
 query = query.Where(p => p.RequisitionNumber.Contains(any req in listReqNumber));
遗憾的是,我们无法将
任何请求放入listReqNumber
中,但我们可以交换
listReqNumber
p.RequisitionNumber
,最终得到一个有效的查询:

 query = query.Where(p => listReqNumber.Any(req => p.RequisitionNumber.Contains(req)));

我建议搜索predicatebuilder类-这是一个已解决的问题,因此您应该使用在visual studio 2010上运行的luckis??您不应该使用vs2010。我们现在正接近2018年底,与2019年的对比已经在预览中。强烈建议您升级我仍在开发使用VS2010、
的旧项目,其中(p=>listReqNumber.Any(req=>p.Contains(req))或使用您已经使用的语法
var result=query.Where(p=>listReqNumber.Contains(p.requisionnumber)
我以前试过,但如果requisionNumber完全相同,例如,数据库中的数据是45321,我输入的数字是453,那么结果是什么都没有,我必须输入45321,有什么想法吗?
 query = query.Where(p => listReqNumber.Any(req => p.RequisitionNumber.Contains(req)));