Делаю с помощью 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();?
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, AlexNek, Вы писали:
AN>>Выполняется ли допустим здесь запрос именно на этапе вызова forumMessages.Count();?
IT>Да.
Спасибо, а как это точно знать самому, "шпион" на базу ставить?
Здравствуйте, 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);
Здравствуйте, 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>
Спасибо, замечательный ответ