如何使用 for 循环创建动态查询?
How to create dynamic query with for loop?
我想根据输入的数字动态创建查询,并使其成为 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]));
}
有什么方法可以动态地输入申请单号吗?
直接这样用怎么样:
var result = from p in query where listReqNumber.Contains(p.RequisitionNumber) select p;
var data = query.Where(q =>
q.RequisitionNumber.Any(w => listReqNumber.Contains(w))
);
您可以使用动态 linq。 Link 在这里:
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");
让我们概括问题:如果我们有一个任意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
但我们可以 交换 listReqNumber
和 p.RequisitionNumber
并最终得到一个有效的查询:
query = query.Where(p => listReqNumber.Any(req => p.RequisitionNumber.Contains(req)));
我想根据输入的数字动态创建查询,并使其成为 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]));
}
有什么方法可以动态地输入申请单号吗?
直接这样用怎么样:
var result = from p in query where listReqNumber.Contains(p.RequisitionNumber) select p;
var data = query.Where(q =>
q.RequisitionNumber.Any(w => listReqNumber.Contains(w))
);
您可以使用动态 linq。 Link 在这里: 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");
让我们概括问题:如果我们有一个任意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
但我们可以 交换 listReqNumber
和 p.RequisitionNumber
并最终得到一个有效的查询:
query = query.Where(p => listReqNumber.Any(req => p.RequisitionNumber.Contains(req)));