I\'m using linq to entities(EF). I have a constructor which takes 4 string parameters. Depending on what parameter is not null I have to build the linq query. I can do with
Linq's DeferredExecution to rescue. Linq query is not executed unless the data is requested from it.
var prod = from p in ctxt.products.expand("items\details")
select p;
if (p1 != null)
{
prod = prod.Where(p => p.x == p1);
}
if (p2 != null)
{
prod = prod.Where(p => p.xx == p2);
}
// Execute the query
var prodResult = prod.ToList();
You can chain the methods as needed:
YourType(string p1, string p2, string p3, string p4)
{
var prod = ctxt.Products.Expand("items\details");
if (!p1.IsNullOrWhiteSpace())
prod = prod.Where(p => p.x == p1);
if (!p2.IsNullOrWhiteSpace())
prod = prod.Where(p => p.xx == p2);
// ....
// use "prod"
}
The resulting SQL should be the same as if you put them all in a single statement.
You could always build the query in pieces and take advantage of delayed query execution:
public Constructor(int? p1, int? p2, int? p3, int? p4)
{
var prod = ctxt.products.expand("items\details");
if(p1 != null)
prod = prod.Where(p.x == p1);
if(p2 != null)
prod = prod.Where(p.xx == p2);
if(p3 != null)
prod = prod.Where(p.xxx == p3);
if(p4 != null)
prod = prod.Where(p.xxxx == p4);
}