Сгенерированный запрос SQL можно получить из свойства Log контекста данных:
Примером будет:
db.Log = Console.Out;
IQueryable<Customer> custQuery =
from cust in db.Customers
where cust.City == "London"
select cust;
foreach(Customer custObj in custQuery)
{
Console.WriteLine(custObj.CustomerID);
}
Для начала и конца выполнения я не думаю, что вы могли бы сделать это специально с linq. Вы можете использовать класс Stopwatch для измерения времени, но при этом также будет рассчитываться время, необходимое среде выполнения .NET для генерации SQL из дерева выражений из интерфейса IQueryable, который представляет ваша инструкция linq to sql.
В простом SQL есть несколько способов узнать время выполнения запроса:
- с использованием средства профилирования сервера SQL
с использованием сценария SQL с параметрами @StartTime
и @EndTime
DECLARE @StartTime datetime,@EndTime datetime
SELECT @StartTime=GETDATE()
-- your query
SELECT @EndTime=GETDATE()
SELECT DATEDIFF(ms,@StartTime,@EndTime) AS [Duration in microseconds]
с использованием сценария SQL с SET STATISTICS TIME (Transact-SQL)
SET STATISTICS TIME ON
GO
-- your query
SET STATISTICS TIME OFF
GO
Что касается количества затронутых рядов, вы также можете попробовать несколько подходов. Вы можете:
попробуйте DataContext.GetChangeSet, это должно вернуть счетчик обновлений
с:
dataContext.GetChangeSet().Updates.Count
попытаться вернуть @@ROWCOUNT
если у вас есть несколько обновлений, вы можете попытаться вернуть их как вывод
параметры из хранимой процедуры