Quick question about using IQueryable objects. Can I do something like that and if not – what is the alternative way?
IQueryable<Item> q = this.ObjectContext.items;
q = q.Where(i => i.price > 100);
...
q = q.Where(i => i.class_name.Contain("apple"));
Update: Here is full code of my function (may be I’m missing something):
public IQueryable<item> Getitem(string filter)
{
// filtering by user departments
IQueryable<item> pre_q = from t_item in this.ObjectContext.items
join t_useritems in this.ObjectContext.user_to_item on
t_item.number equals t_useritems.number
where t_useritems.user_name == this.userName
select t_item;
if (filter != null)
{
QueryFilter qf = new QueryFilter(filter);
string _excludeClass = qf.GetPropertyValueByName("excludeClass");
string _excludeSubcat = qf.GetPropertyValueByName("excludeSubcat");
string _searchBy = qf.GetPropertyValueByName("searchby");
string _search = qf.GetPropertyValueByName("search");
if (!string.IsNullOrEmpty(_excludeClass))
pre_q = pre_q.Where(i => i.class_name != _excludeClass);
if (!string.IsNullOrEmpty(_excludeSubcat))
pre_q = pre_q.Where(i => i.subcat_name != _excludeSubcat);
if (!string.IsNullOrEmpty(_searchBy) && !string.IsNullOrEmpty(_search))
{
if (_searchBy == "number")
pre_q = pre_q.Where(i => i.number.Contains(_search));
else if (_searchBy == "description")
pre_q = pre_q.Where(i => i.description.Contains(_search));
else if (_searchBy == "class_name")
pre_q = pre_q.Where(i => i.class_name.Contains(_search));
else if (_searchBy == "cat_name")
pre_q = pre_q.Where(i => i.cat_name.Contains(_search));
else if (_searchBy == "subcat_name")
pre_q = pre_q.Where(i => i.subcat_name.Contains(_search));
else if (_searchBy == "all_fields")
pre_q = pre_q.Where(i => i.number.Contains(_search) ||
i.description.Contains(_search) ||
i.class_name.Contains(_search) ||
i.cat_name.Contains(_search) ||
i.subcat_name.Contains(_search));
}
}
}
return pre_q.OrderBy(i => i.number);
}
Essentially what’s happening – I pass excludeClass filter and some search text filter. After applying excludeClass I can see that number of records is correct, however when I after apply search filter – it basically reset already filtered items and they are getting back in the result.
Yes, you can.
IQueryable<T>is “composable”. That’s fine. It will only evaluate the final composed query when you do something that needs the data, for example aToList(), aforeach, or an aggregate such asCount(),Max(), etc. That pattern is pretty much how a lot of multi-field search screens work.