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

时间:2018-12-10 03:13:01

标签: c# linq visual-studio-2010

我想根据输入的数字动态创建查询并将其放入 array 以从视图中获取数据,因此我可以创建条件对其进行过滤,但我的查询仅适用于 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]));
}

有什么办法可以动态地生成它,以便我可以输入所需的申请号吗?

4 个答案:

答案 0 :(得分:1)

让我们泛化这个问题:如果我们有一个任意 listReqNumber数组,我们想实现

query = query.Where(
   p => p.RequisitionNumber.Contains(listReqNumber[0]) ||
        p.RequisitionNumber.Contains(listReqNumber[1]) || 
        ...
        p.RequisitionNumber.Contains(listReqNumber[listReqNumber.Length - 1])
);

或者-让我们摆脱||-我们希望any中的req项目listReqNumber包含在p.RequisitionNumber

 // doesn't compile - just the idea   
 query = query.Where(p => p.RequisitionNumber.Contains(any req in listReqNumber));

可惜,我们不能放any req in listReqNumber,但可以交换 listReqNumberp.RequisitionNumber,最后得到一个有效的查询:

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

答案 1 :(得分:0)

如果直接像这样使用怎么办?

● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: activating (start-post) (Result: exit-code) since 一 2018-12-10 11:45:31 CST; 13s ago
Process: 7442 ExecStart=/usr/sbin/mysqld (code=exited, status=2)
Process: 7434 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 7442 (code=exited, status=2);         : 7443 (mysql-systemd-s)
CGroup: /system.slice/mysql.service
       └─control
         ├─7443 /bin/bash /usr/share/mysql/mysql-systemd-start post
         └─7488 sleep 1

12月 10 11:45:31 user-70DGA014CN systemd[1]: Starting MySQL Community Server...

答案 2 :(得分:0)

var data = query.Where(q =>
  q.RequisitionNumber.Any(w => listReqNumber.Contains(w))
);

答案 3 :(得分:0)

您可以使用动态linq。链接在这里: https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library

然后具有如下功能:

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

然后使用动态linq,如:

var query = northwind.Products
                         .Where(testQuery).OrderBy("SupplierID");