Reduce linq query for filtering

c#, entity-framework, linq, sql, wpf

Solution

Compose query with lambda syntax:

IQueryable<Supplier> query = Context.Suppliers;

if (!String.IsNullOrEmpty(nameMatch))
   query = query.Where(s => s.SupplierName == nameMatch);

if (!String.IsNullOrEmpty(contactMatch))
   query = query.Where(s => s.ContactName == contactMatch);

// etc

return query.AsEnumerable();

Another option is adding parameter-checking conditions to query

var query = 
   from s in Context.Suppliers
   where (String.IsNullOrEmpty(nameMatch) || s.SupplierName == nameMatch) &&
         (String.IsNullOrEmpty(contactMatch) || s.ContactName == contactMatch)
         // etc
   select s;

Problem

I have a view with 3 textboxes which bind to properties in the ViewModel `SupplierName`, `Contact`, `Address` and one button which bind to `SearchCommand` property in my ViewModel. My requirement is to filter `Supplier` records based on the above properties. I used EntityFramework. The user can enter any of the above textboxes which lead me to write 9 different queries. For instance if the user inputs data only on the `SupplierName` textbox then I need to run one query with `SupplierName` as parameter. If the user enters `SupplierName` and `Contact` textboxes then I need to run another query. And so on. Here is my code: ``` public IEnumerable<Model.Supplier> GetAllSuppliersBySearch(string nameMatch, string contactMatch, string phoneMatch) { if(nameMatch!=null) { var q = from f in Context.Suppliers where f.SupplierName==nameMatch select f; } else if(contactMatch!=null) { var q = from f in Context.Suppliers where f.ContactName==contactMatch select f; } else if(phoneMatch!=null) { var q = from f in Context.Suppliers where f.ContactName==contactMatch select f; } return q.AsEnumerable(); } ``` Instead of writing multiple queries, how to accomplish this with one query or in any optimized way?

Original source