0

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?

6
  • i would recommend searching for a predicatebuilder class - this is a solved problem so you should be in luck Commented Dec 10, 2018 at 3:15
  • is that works on visual studio 2010?? Commented Dec 10, 2018 at 3:16
  • you should not be using vs2010. we are now reaching the end of 2018 with vs 2019 already in preview. strongly recommend you upgrade Commented Dec 10, 2018 at 3:18
  • im still developing old project that use vs 2010,, Commented Dec 10, 2018 at 3:20
  • 1
    .Where(p => listReqNumber.Any(req => p.Contains(req))); Commented Dec 10, 2018 at 7:07

4 Answers 4

1

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)));
Sign up to request clarification or add additional context in comments.

Comments

0

How about if you use directly like this:

var result = from p in query where listReqNumber.Contains(p.RequisitionNumber) select p;

2 Comments

Or to use the syntax you're already using var result = query.Where(p => listReqNumber.Contains(p.RequisitionNumber);
i have tried it before, but its work if RequisitionNumber exactly same, for example, data in database is 45321 , the number that i enter is 453, then the result is nothing, I have to enter exactly 45321, any idea for my chase?
0
var data = query.Where(q =>
  q.RequisitionNumber.Any(w => listReqNumber.Contains(w))
);

Comments

0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.