75

How is it done using the ObjectQuery method?

nellbryant
  • 3,109
  • 4
  • 20
  • 16

8 Answers8

69

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; }
    }
}
Chris Schiffhauer
  • 17,102
  • 15
  • 79
  • 88
Tj Kellie
  • 6,336
  • 2
  • 31
  • 40
  • 6
    For those using **Entity Framework 6** check [this](http://stackoverflow.com/a/20751723/2218697), hope helps someone. – Shaiju T Feb 01 '16 at 08:39
  • 4
    you can just use `context.Log = Console.Out;` it's way simpler – Poat Apr 07 '21 at 16:14
30

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;
    }
}
Cyril Gandon
  • 16,830
  • 14
  • 78
  • 122
nellbryant
  • 3,109
  • 4
  • 20
  • 16
20
 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

gyozo kudor
  • 6,284
  • 10
  • 53
  • 80
  • 2
    If 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
20

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
marc_s
  • 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
7

You could run the SQL Server Profiler.

guiomie
  • 4,988
  • 6
  • 37
  • 67
  • 1
    If 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
6

This is what I use when setting up the database context:

this.DbContext.Database.Log += s => Debug.WriteLine(s);
user8128167
  • 6,929
  • 6
  • 66
  • 79
1

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;
liminal18
  • 563
  • 7
  • 21
1

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.

jaibalaji
  • 3,159
  • 2
  • 15
  • 28
Giridhar94
  • 29
  • 5