2015-03-19 2 views
0

У меня есть объект IQueryable, представляющий некоторый запрос по моей db-модели. Теперь мне нужно сделать некоторые проверки в этой IQeryable и вернуться обратно объект таким образомВыполнение предложения Any() в отношении объекта IQueryable

private IQuerable<myTableType> ValidateQery (IQuerable<myTableType> query , string user) 
{ 
      return query.Where (x => db.tblUsers.Where(y => y.User == user && y.Privilege >= x.PrivilegeRequired).Any()) 
} 

Теперь то, что я хотел бы понять, если любой() пункт выполняется immidiatly или если он генерирует T-SQL который будет объединен с предыдущим. Я прошу, потому что я wuold избегаю выполнения запроса против db в тот момент.

Редактировать: Благодарим за консультацию по поводу использования «using». Это была ошибка, которую я сделал сейчас (написав этот пример кода), потому что я не могу проверить код сейчас (у меня нет визуальной студии на моей машине в этот момент), но моя проблема в целом была связана с этой ситуацией.

ответ

6

Any находится внутри лямбда в Queryable.Where , и как таковой не выполняется как код C# и вместо этого переводится в Expression и передается поставщику запроса, когда перезагружается IQueryable, возвращенный с Where.

На узле сайта вы удаляете контекст перед возвратом IQueryable, который вы можете повторить, так что он всегда будет терпеть неудачу, когда вы выполните повторение.

+0

Спасибо, что разъяснили мою идею о том, как выполняется объект IQeryable. – Skary

+0

@Servy Я должен спросить, учитывая, что он использует «db» в качестве своего контекста, и он не помещает его как ошибку, и он не передает его, можно предположить, что db объявляется как уровень модуля/класс. В этом случае контекст может быть или не быть удален до выполнения, правильно? –

+0

@RobertMcKee Он отредактировал код в течение льготного периода. – Servy

3

Это часть запроса - это в статье Where.

Нет, это не будет выполнено немедленно. Сказав это, вы, кажется, закрывая контекст, который использует запрос, поэтому я подозреваю, что к тому времени он используется, она будет сломана ...