Dynamic where clause in Linq to Entities

前端 未结 3 2120
予麋鹿
予麋鹿 2020-12-31 11:57

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

相关标签:
3条回答
  • 2020-12-31 12:25

    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();
    
    0 讨论(0)
  • 2020-12-31 12:32

    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.

    0 讨论(0)
  • 2020-12-31 12:44

    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);
    }
    
    0 讨论(0)
提交回复
热议问题