Мне очень нравится PredicateBuilder . Это позволяет мне создавать все виды запросов очень динамично. Переменную предиката можно передавать различным объектам, и они могут добавлять к ней значения, о которых они знают, и т. Д. За исключением случаев, когда мне нужно использовать .Contains в хешированной коллекции. Bzzt! Крушение и сгорание.
Например (пример / псевдокод, это может или не может скомпилировать / запустить):
protected Expression<Func<MyClass, bool>> GetWherePredicate()
{
string[] selectedValues = Request.Form.GetValues("checkbox1") ?? new string[0];
HashSet<int> selectedIDs = new HashSet<int>(selectedValues.Cast<int>());
Expression<Func<MyClass, bool>> predicate = PredicateBuilder.True<MyClass>();
predicate = predicate.And(s => selectedIDs.Contains(s.ID));
return predicate;
}
protected void Retrieve()
{
Expression<Func<MyClass, bool>> predicate = GetWherePredicate();
IEnumerable<MyClass> retrievedValues = MyDataContext.GetTable<MyClass>.Where(predicate);
}
Когда я пытаюсь это сделать, я получаю NotSupportedException: метод 'Boolean Contains (Int32)' не имеет поддерживаемого перевода в SQL из-за того, что выбранный идентификатор HashSet не находится в области действия. Если я делаю все это одним и тем же способом, то он работает нормально.
Мне нужно знать, как правильно разрешить или скомпилировать мой предикат, чтобы он мог использоваться в другой области, отличной от той, в которой объявлен HashSet. Любая помощь?
ОБНОВЛЕНИЕ: у меня было это довольно неправильно. Приведенный ниже код работает нормально, поэтому нет конфликта контекста. Спасибо, Джей.
string[] selectedValues = Request.Form.GetValues("checkbox1") ?? new string[0];
Expression<Func<MyClass, bool>> predicate = PredicateBuilder.True<MyClass>();
predicate = predicate.And(s => selectedValues.Contains(s.ID.ToString()));