Search code examples
c#linqentity-frameworkentity-framework-4

Creating dynamic queries with entity framework


I would like to know what is the best way of creating dynamic queries with entity framework and linq.

I want to create a service that has many parameters for sorting and filtering (over 50). I will be getting object from gui where these will be filled out... and query will be executed from a single service method.

I looked around And I saw that I could dynamically create a string that can be executed at the end of my method. I don't like this way very much. Is there a better way to do this? Preferably type safe with compile check?


Solution

  • You could compose an IQueryable<T> step by step. Assuming you have a FilterDefinition class which describes how the user wants to filter ...

    public class FilterDefinition
    {
        public bool FilterByName { get; set; }
        public string NameFrom { get; set; }
        public string NameTo { get; set; }
    
        public bool FilterByQuantity { get; set; }
        public double QuantityFrom { get; set; }
        public double QuantityTo { get; set; }
    }
    

    ... then you could build a query like so:

    public IQueryable<SomeEntity> GetQuery(FilterDefinition filter)
    {
        IQueryable<SomeEntity> query = context.Set<SomeEntity>();
        // assuming that you return all records when nothing is specified in the filter
    
        if (filter.FilterByName)
            query = query.Where(t => 
                t.Name >= filter.NameFrom && t.Name <= filter.NameTo);
    
        if (filter.FilterByQuantity)
            query = query.Where(t => 
                t.Quantity >= filter.QuantityFrom && t.Quantity <= filter.QuantityTo);
    
        return query;
    }