Entity Framework with Dynamic Linq

c# dynamic-linq entity-framework linq

Question

Using EntityFramework context i need to search with many fields.

The EntityDBContext includes

public class Brand
{
    public int BrandID { get; set; }
    public string BrandName { get; set; }
    public string BrandDesc { get; set; }
    public string BrandUrl { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

public class Product
{
    public string Name {get;set;}
            public DateTime CreatedDate {get;set;}    
            public DateTime ExpiryDate {get;set;}
    //The product class also contains many fields.(not shown here)
}

var context = new EntityDBContext();

I would like to search the brand with using the field in Product. The fields of the product are only known at run time. How can i build the expression to search the brand using the product fields. Please see the screenshot. Thanks, Binod

User search form

1
1
5/19/2014 7:58:27 AM

Popular Answer

First off, I'm a bit unclear on this part of your question:

the fields of the product are only known at run time.
How so? Can you elaborate on this, because I don't see a working implementation of this using EF. What is your database table (Products presumably) set up for? What properties are in that class?

We need to know that before we can give you an accurate answer. However, I'll give you a more general example, maybe that helps you in understanding.

var all_brands_that_sell_shoes = /* But not always ONLY shoes */
        myDataContext.Brands
                     .Where(brand =>
                                 brand.Products.Any(product =>
                                                          product.Type == "Shoe")
                            )
                     .ToList();

Edit

If I re-read your question, you don't mean that the Product class' properties are not know until runtime; but that you don't know in advance which filters need to be applied and which need to be skipped?

This second answer assumes that is what you want. Again, I don't know your class' properties since you didn't post them, so I'm inventing my own fields for the sake of example.

First, make an object like below. This will be used to aggregate all filters you wish to apply to the selection:

public class MySearchCriteria
{
    public string ProductName_Contains   { get; set; }
    public int    ProductWeight_LessThan { get; set; }
    public int    ProductType_Id         { get; set; }
}

When you want to filter the list, you pass a MySearchCriteria object to the method:

public List<Brand> GetFilteredList(MySearchCriteria filters)
{
    var brands = myDataContext.Brands; //All brands (for now)

    if(filters.ProductType_Id > 0)
    {
          //IF the filter has a value, filter the list accordingly:
          brands = brands.Where(brand => brand.Products.Any(product => product.TypeId == filters.ProductType_Id);
    }

    if(filters.ProductWeight_LessThan > 0)
    {
          //IF the filter has a value, filter the list accordingly:
          brands = brands.Where(brand => brand.Products.Any(product => product.Weight < filters.ProductWeight_LessThan));
    }

    if(!String.IsNullOrWhiteSpace(filters.ProductName_Contains))
    {
          //IF the filter has a value, filter the list accordingly:
          brands = brands.Where(brand => brand.Products.Any(product => product.Name.Contains(filters.ProductName_Contains)));
    }

     return brands.ToList();
}

This method makes sure that the list was filtered according to the SearchCriteria you provided.

If you didn't use the field filters.ProductName_Contains for example, it would be an empty string, and the if-evaluation would've prevented you from filtering based on an empty string. In the end, you would not have applied a name-based filter.

I hope this is the answer you were looking for? If not, please elaborate more as I'm having trouble understanding what it is you want then.

0
5/19/2014 8:00:01 AM


Related Questions





Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow