Когда выполняется скомпилированный запрос, который возвращает IQueryable? - PullRequest
6 голосов
/ 18 сентября 2009

Хорошо, мне нужна проверка работоспособности здесь ...

Я скомпилировал запрос, который возвращает IQueryable при выполнении.

В каких строках должен выполняться запрос к базе данных в следующем примере?

101 IQueryable<T> results = MyCompiledQuery(MyDataContext);
102 List<T> final = (from t in result
103                  where t.ID > 5
104                  select t).ToList<T>();

Вот как я определяю скомпилированный запрос

 public static Func<MyDataContext, IQueryable<Widget>> MyCompiledQuery=
        CompiledQuery.Compile<MyDataContext, IQueryable<Widget>>(
                      (MyDataContext db) =>
                      from w in db.Widgets
                      where ((w.Type == WidgetType.Atype ||  //Widget.Atype is a Linq to Sql object, that I've defined statically
                              w.Type == WidgetType.Btype ||  //See above comment
                              w.Type == WidgetType.Ctype ) && //See above comment
                              w.Location == WidgetLocation.Domestic)  //Samething applies here
                        select euc);

ДЛЯ ДОПОЛНИТЕЛЬНОГО ОБСУЖДЕНИЯ ПОЖАЛУЙСТА, ОБРАТИТЕСЬ К: LINQ to SQL скомпилированные запросы и когда они выполняются

Ответы [ 5 ]

2 голосов
/ 18 сентября 2009

Выполняется в строке 104 (когда вы вызываете ToList ()).

Скомпилированный запрос - это запрос, который транслируется только один раз в TSQL во время компиляции, а не каждый раз перед выполнением.

2 голосов
/ 18 сентября 2009

"В строке 104 при преобразовании ToList."

Ну, этот ответ неверен. Мы вызываем делегат, хранящийся в переменной MyCompiledQuery, в строке 101, который возвращает результат скомпилированного запроса, а не сам запрос.

1 голос
/ 06 июля 2011

Этот запрос выполняется в строке 101. Я проверил его, выполнив трассировку SQL Profiler. Я думаю, это потому, что это скомпилированный запрос.

Фильтрация, которую вы делаете после слов> 5, выполняется в памяти.

0 голосов
/ 07 февраля 2012

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

В этом случае я думаю, что в тот момент, когда его просят преобразовать в список, он запрашивает результат. И нет смысла бороться за линии 102 и 104, так как оба представляют одну линию.

0 голосов
/ 18 сентября 2009

Это называется отложенным исполнением.
Вы можете прочитать хороший пост об этом здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...