Search products from database on base of search filters
At least a couple things to note:

Bug?

I think this part doesn't work because you don't assign the result of this query back to the variable.

if(search.filter != null)
{
    var fs = search.filter.SelectMany(c =&gt; c.Value.Select(a =&gt; new Models.Custom_Model.IdName {Id = c.Id,Name = a}));
    products.Where(z=&gt;((z.productattributes.Select(c=&gt;new Models.Custom_Model.IdName {Id = c.AttributeId,Name = c.Value})).Intersect(fs)).Any());
}


Naming

Public properties should be in PascalCasing (msdn) private variables in camelCase. 

Also, some using-statements would remove the namespace-clutter.

Line breaks

I think couple of line breaks would make long lines more readable. First line as an example.

var products = _db.products
    .Include(a =&gt; a.category)
    .Include(c =&gt; c.subcategory)
    .Include(c =&gt; c.productattributes)
    .Where(c =&gt; c.SubCategoryId == subcategoryId &amp;&amp; c.subcategory.isActive &amp;&amp; c.category.isActive);


Refactoring to smaller methods

Pagination (skipping and taking x records) is pretty general concept, so it should perhaps be moved to to its own, generic function.

Also, sorting could be moved to its own method

SearchModel refactoring

I remove private variables from SearchModel because they are only used for defaults. I would set defaults in constructor so defaults are in one place. Filter doesn't need to be set but I set it here for consistency.

I also renamed Criteria to SortingCriteria to make the meaning clearir. If it is only Criteria, it is not clear if it is used to filter the query or sorting.

public int PageSize { get; set; }
public int PageNumber { get; set; }
public Enum.SortingCriteria SortingCriteria { get; set; }
public List&lt;FiltersViewModel&gt; Filter { get; set; }

public SearchModel()
{
    PageSize = 50;
    PageNumber = 1;
    SortingCriteria = Enum.SortingCriteria.New;
    Filter = null;
}