Sebbene si possano utilizzare comodamente strumenti tipo SQL Server Profiler per analizzare gli statement generati da LINQ to SQL, un modo alternativo sicuramente molto veloce si basa sulla proprietà DataContext.Log (di tipo System.IO.TextWriter), che permette di specificare la destinazione su cui verrà scritto automaticamente il log dei comandi/query SQL autogenerati. Ad esempio, il seguente codice:
NorthwindDataContext NorthwindDC = new NorthwindDataContext();
NorthwindDC.Log = Console.Out;
var results = from c in NorthwindDC.Customers
where c.CustomerID.StartsWith("A")
select new { c.CustomerID, c.ContactName, c.Country };
permette di "forzare" (tramite la riga
NorthwindDC.Log = Console.Out;) la scrittura dello statement SQL generato nella console:
SELECT [t0].[CustomerID], [t0].[ContactName], [t0].[Country]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[CustomerID] LIKE @p0
-- @p0: Input NVarChar (Size = 2; Prec = 0; Scale = 0) [A%]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8
In aggiunta, un utilizzo sicuramente interessante potrebbe essere applicato al nuovo LinqDataSource di ASP.NET 3.5. Ad esempio, potremmo pensare di implementare l'evento ContextCreated del nostro LinqDataSource in modo da impostare la proprietà Log del nostro DataContext su uno StringWriter: in questo modo, qualora volessimo visualizzare lo statement SQL autogenerato dal LinqDataSource direttamente nella nostra pagina, potremmo semplicemente ricorrere ad una Label (es. LogLabel) da inizializzare all'occorrenza dell'evento Selected del LinqDataSource:
System.IO.StringWriter text_writer = new System.IO.StringWriter();
protected void MyLinqDataSource_ContextCreated(object sender, LinqDataSourceStatusEventArgs e)
{
System.Data.Linq.DataContext data_context = (System.Data.Linq.DataContext)e.Result;
data_context.Log = text_writer;
}
protected void MyLinqDataSource_Selected(object sender, LinqDataSourceStatusEventArgs e)
{
LogLabel.Text = text_writer.ToString();
}
Technorati tags: LINQ