Dynamic where clause in Linq to Entities

14,884

Solution 1

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

Solution 2

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.

Solution 3

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);
}
Share:
14,884
Deepak
Author by

Deepak

Updated on June 05, 2022

Comments

  • Deepak
    Deepak almost 2 years

    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 if else statements but i also has other constructor with 10 parameters in that case there will be many combinations to check.

    Example:

    Constructor(p1,p2,p3,p4)
    {
      var prod= from p in ctxt.products.expand("items\details")
                where p.x==p1 && p.xx==p2 && p.xxx==p3 && p.xxxx==p4
                select p;
    }
    

    In the above where clause there should be condition checks only if the parameter is not null. ie., if p2 is null then the where clause should look like

    where p.x==p1 && p.xxx==p3 && p.xxxx==p4
    

    if p2 and p3 are null then

    where p.x==p1 && p.xxxx==p4
    

    Can anyone tell me how to handle this. if possible can you give sample code for this

  • Deepak
    Deepak over 12 years
    if we do like this we will be loading large amount of data in prod and then we are taking subset of it. Can we get the subset directly.
  • amit_g
    amit_g over 12 years
    The query is NOT executed until after the where clause is built. Inn the above code the query is built until the very last line and that is where it is executed. You can ch3eck this by running SQL profiler.
  • Deepak
    Deepak over 12 years
    if we do like this we will be loading large amount of data in prod and then we are taking subset of it. Can we get the subset directly otherwise we are loading unnecessary data
  • Deepak
    Deepak over 12 years
    if we do like this we will be loading large amount of data in prod and then we are taking subset of it. Can we get the subset directly otherwise we are loading unnecessary data
  • Reed Copsey
    Reed Copsey over 12 years
    @Deepak No, you won't. The nice thing about IQueryable is that it doesn't "load the data" - LINQ uses deferred execution, and with EF, it translates the final "query" into a single SQL statement. This will be the same result.
  • Reed Copsey
    Reed Copsey over 12 years
  • Deepak
    Deepak over 12 years
    Yes you are correct. I can use your code and its perfectly working.
  • Justin Niessner
    Justin Niessner over 12 years
    @Deepak - You won't be loading any data at all. LINQ doesn't execute the query until you actually use the data. By the time the query executes, you'll already have the proper where clauses in place to load only the data you need.
  • HamedH
    HamedH almost 7 years
    can we use async here?
  • Afshar Mohebi
    Afshar Mohebi almost 5 years
    Here p1 and p2 are added in the AND condition. Is ther a way to enforce an OR join?
  • Afshar Mohebi
    Afshar Mohebi almost 5 years
    Here p1 and p2 are added in the AND condition. Is ther a way to enforce an OR join?
  • Afshar Mohebi
    Afshar Mohebi almost 5 years
    Here p1 and p2 are added in the AND condition. Is ther a way to enforce an OR join?