Reputation: 20
I want to create query dynamically based on entered number and make it to array to get data from view, so I can create condition to filter it, but my query only works for 3 entered numbers.
var query = from bs in dc.VwResourceAssignments select bs;
var listReqNumber = new[] {123, 456, 789};
My current query is:
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]));
}
Is there any way to make it dynamically so I can input requisition number as many as I want?
Upvotes: 0
Views: 334
Reputation: 186833
Let's generalize the problem: if we have an arbitrary listReqNumber
array we want to implement
query = query.Where(
p => p.RequisitionNumber.Contains(listReqNumber[0]) ||
p.RequisitionNumber.Contains(listReqNumber[1]) ||
...
p.RequisitionNumber.Contains(listReqNumber[listReqNumber.Length - 1])
);
or - let's get rid of ||
- we want any
item req
withing listReqNumber
be contained in p.RequisitionNumber
// doesn't compile - just the idea
query = query.Where(p => p.RequisitionNumber.Contains(any req in listReqNumber));
Pity, we can't put any req in listReqNumber
but we can swap listReqNumber
and p.RequisitionNumber
and finally have a valid query:
query = query.Where(p => listReqNumber.Any(req => p.RequisitionNumber.Contains(req)));
Upvotes: 1
Reputation: 6528
You can use dynamic linq. Link is here: https://weblogs.asp.net/scottgu/dynamic-linq-part-1-using-the-linq-dynamic-query-library
then have a function like below:
string GetQuery(int num)
{
return $"p.RequisitionNumber.Contains(listReqNumber[{num}])";
}
Create a query like below in 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);
then use dynamic linq like:
var query = northwind.Products
.Where(testQuery).OrderBy("SupplierID");
Upvotes: 0
Reputation: 86
var data = query.Where(q =>
q.RequisitionNumber.Any(w => listReqNumber.Contains(w))
);
Upvotes: 0
Reputation: 4211
How about if you use directly like this:
var result = from p in query where listReqNumber.Contains(p.RequisitionNumber) select p;
Upvotes: 0