Когда происходит реальное выполнение запроса?
От: AlexNek  
Дата: 31.05.11 22:38
Оценка:
Делаю с помощью Linq и BLToolkit различные запросы к базе (доработка программы Янус). Все в одном запросе не объединишь.
Получаются различные части в которых почти всегда можно глянуть SQL. Вроде немного разобрался как делать простые запросы.
Но не совсем понятно когда именно происходит реальное обращение к базе и выполняется запрос.
Есть достаточно многоступенчатый запрос чисто для подсчета количества, не хотелось бы его выполнять раньше времени. (До того как он будет полностью готов.)

Вот простой пример

        protected IQueryable<IForumMessage> GetMessages(DbManager db)
        {
            return db.Messages(m => m.UserID == Config.Instance.SelfId); 
        }


            using (DbManager db = ServiceProvider.CreateDBManager())
            {
                IQueryable<IForumMessage> forumMessages = GetMessages(db);
                RepliesCount = forumMessages.Count();
                UnreadCount = forumMessages.Count(im => !im.IsRead);
            }


функция GetMessages вызывается для конструирования других запросов также.

Типа добавляем сортировку
                IOrderedQueryable<IForumMessage> messages = forumMessages.OrderByDescending(m => m.Date);

Выполняется ли допустим здесь запрос именно на этапе вызова forumMessages.Count();?
Cообщение написано в ... &lt;&lt; RSDN@Home 1.2.0 alpha 5-AN-R4 rev. 3517&gt;&gt;
Re: Когда происходит реальное выполнение запроса?
От: IT Россия linq2db.com
Дата: 31.05.11 23:18
Оценка:
Здравствуйте, AlexNek, Вы писали:

AN>Выполняется ли допустим здесь запрос именно на этапе вызова forumMessages.Count();?


Да.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Когда происходит реальное выполнение запроса?
От: AlexNek  
Дата: 01.06.11 16:48
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, AlexNek, Вы писали:


AN>>Выполняется ли допустим здесь запрос именно на этапе вызова forumMessages.Count();?


IT>Да.

Спасибо, а как это точно знать самому, "шпион" на базу ставить?
Cообщение написано в ... &lt;&lt; RSDN@Home 1.2.0 alpha 5-AN-R4 rev. 3517&gt;&gt;
Re[3]: Когда происходит реальное выполнение запроса?
От: IT Россия linq2db.com
Дата: 01.06.11 17:04
Оценка:
Здравствуйте, AlexNek, Вы писали:

AN>>>Выполняется ли допустим здесь запрос именно на этапе вызова forumMessages.Count();?

IT>>Да.
AN>Спасибо, а как это точно знать самому, "шпион" на базу ставить?

Всё очень просто. Запрос выполняется в двух случаях:

— когда завершающим методом выражения является метод, возвращаемый что-либо отличное от IQueryiable. К таким методам относятся Count, First, ToList, AsEnumerable и т.п;
— когда происходит обращение к IQueryiable как к энумератору. Например, в цикле foreach.

В bltoolkit в отладочной версии можно настроить вывод генерируемого SQL в окно отладки вызовом метода DbManager.TurnTraceSwitchOn(). Если используется release сборка библиотеки, то необходимо ещё перенаправить вывод отладочной информации из релиз версии в отладчик:

DbManager.WriteTraceLine = (message,displayName) => Debug.WriteLine(message, displayName);
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Когда происходит реальное выполнение запроса?
От: AlexNek  
Дата: 01.06.11 17:18
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, AlexNek, Вы писали:


AN>>>>Выполняется ли допустим здесь запрос именно на этапе вызова forumMessages.Count();?

IT>>>Да.
AN>>Спасибо, а как это точно знать самому, "шпион" на базу ставить?

IT>Всё очень просто. Запрос выполняется в двух случаях:


IT>- когда завершающим методом выражения является метод, возвращаемый что-либо отличное от IQueryiable. К таким методам относятся Count, First, ToList, AsEnumerable и т.п;

IT>- когда происходит обращение к IQueryiable как к энумератору. Например, в цикле foreach.

IT>В bltoolkit в отладочной версии можно настроить вывод генерируемого SQL в окно отладки вызовом метода DbManager.TurnTraceSwitchOn(). Если используется release сборка библиотеки, то необходимо ещё перенаправить вывод отладочной информации из релиз версии в отладчик:


IT>
IT>DbManager.WriteTraceLine = (message,displayName) => Debug.WriteLine(message, displayName);
IT>


Спасибо, замечательный ответ
Cообщение написано в ... &lt;&lt; RSDN@Home 1.2.0 alpha 5-AN-R4 rev. 3517&gt;&gt;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.