Giri22
Giri22

Reputation: 20

How to create dynamic query with for loop?

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

Answers (4)

Dmitrii Bychenko
Dmitrii Bychenko

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

Gauravsa
Gauravsa

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

Petr Bogoyavlenskiy
Petr Bogoyavlenskiy

Reputation: 86

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

Upvotes: 0

Vijunav Vastivch
Vijunav Vastivch

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

Related Questions