How is it done using the ObjectQuery method?
8 Answers
You can always attach something to the .Log property of your DataContext. That will show all the SQL commands as they are sent.
I do this in my base for data access objects and output it to the Visual Studio debug console. As the objects create their DataContext I check it see if its debug and attach a TextWritter helper class like this:
dbDataContext _dB = new dbDataContext();
_dB.CommandTimeout = 5000;
#if DEBUG
_dB.Log = new DebugTextWriter();
#endif
Here is the helper object for output to the debug console:
//utility class for output of TextWriter for the Visual Sudio Debug window
class DebugTextWriter : System.IO.TextWriter
{
public override void Write(char[] buffer, int index, int count)
{
System.Diagnostics.Debug.Write(new String(buffer, index, count));
}
public override void Write(string value)
{
System.Diagnostics.Debug.Write(value);
}
public override Encoding Encoding
{
get { return System.Text.Encoding.Default; }
}
}

- 17,102
- 15
- 79
- 88

- 6,336
- 2
- 31
- 40
-
6For those using **Entity Framework 6** check [this](http://stackoverflow.com/a/20751723/2218697), hope helps someone. – Shaiju T Feb 01 '16 at 08:39
-
4you can just use `context.Log = Console.Out;` it's way simpler – Poat Apr 07 '21 at 16:14
Here is what I found using ObjectQuery Method. Using console for testing, you can do the following:
Create an Extension Method as below, then call it. Say Product product, then SQL prints out as product.ToTraceString.
public static class MyExtensions
{
public static string ToTraceString<T>(this IQueryable<T> t)
{
string sql = "";
ObjectQuery<T> oqt = t as ObjectQuery<T>;
if (oqt != null)
sql = oqt.ToTraceString();
return sql;
}
}

- 16,830
- 14
- 78
- 122

- 3,109
- 4
- 20
- 16
-
5It can be used in VS Watch window too: `((ObjectQuery)myQuery).ToTraceString()`. Nice one! – icebat Mar 21 '13 at 09:51
-
-
6I don't think works when using dbContext as you can't cast IQueryable
to ObjectQuery – NER1808 Oct 21 '14 at 13:58in this case.
var q = from img in context.Images
...
select img;
string sql = q.ToString();
sql
will contain the sql select query.
EDIT: disadvantage: parameters won't have any values at this time

- 6,284
- 10
- 53
- 80
-
2If you're debugging locally and using SQL Server, run the SQL Profiler. The query with all parameters will show up there. – Rich Aug 11 '17 at 21:24
You could have a look at the Linq-to-SQL Debug Visualizer, or just hover your mouse over your Linq-to-SQL query (tooltip should show generated SQL), or access:
context.GetCommand(query).CommandText

- 732,580
- 175
- 1,330
- 1,459
-
I haven't tried that GetCommand yet. I like the link from Scott Gu! Is that Visualizer built-in Visual Studio 2010? – nellbryant Feb 04 '11 at 16:31
-
@nellbryant: no, it's still a separate extension that you need to grab from the VS gallery – marc_s Feb 04 '11 at 16:33
You could run the SQL Server Profiler.

- 4,988
- 6
- 37
- 67
-
1If you use SQL profiler, to ensure capture of all LINQ queries from your VS debug session, use SQL Profiler 'RPC Completed' and 'SQL:BatchCompleted' events. – Iomm1 Sep 24 '18 at 09:11
This is what I use when setting up the database context:
this.DbContext.Database.Log += s => Debug.WriteLine(s);

- 6,929
- 6
- 66
- 79
just a small update you can now use an Action to log the SQL:
// test SQL logger
Action<string> SQLLogger = (message) => System.Diagnostics.Debug.Write(message);
_dB.Context().Database.Log = SQLLogger;

- 563
- 7
- 21
If you are executing the linq query against a database, you can run the SQL Profiler to record the SQL query that is being executed. We do it quite often to identify any performance impact on conversion.

- 3,159
- 2
- 15
- 28

- 29
- 5