How do I get the raw SQL underlying a LINQ query w

2019-03-18 01:59发布

I've using Entity Framework CTP5 in "code only" mode. I'm running a LINQ query on a object that was return from the database, as the query is running really slowly. Is there any way in which I can get the SQL statement that is being generated from the query?

Topic currentTopic =
    (from x in Repository.Topics
     let isCurrent = (x.StoppedAt <= x.StartedAt || (x.StartedAt >= currentTopicsStartedAtOrAfter))
     where x.Meeting.Manager.User.Id == user.Id && isCurrent
     orderby x.StartedAt descending
     select x).FirstOrDefault();

The "Repository" property is a descendent of DbContext.

It's a little complicated, as EF can't use my helper methods on the objects, so I'm specifying the logic directly in the query.

So, is there any way I can dump the SQL that will be produced by that LINQ query (e.g. to my log4net repository)?

5条回答
劳资没心,怎么记你
2楼-- · 2019-03-18 02:21

I'd either use SQL Trace to grab the query running on the server directly, or use the Event Tracing for Windows (SQL Profiling) feature out of ANTS Performance Profiler.

查看更多
兄弟一词,经得起流年.
3楼-- · 2019-03-18 02:26

This worked for me and it is free:

public static class DebugExtensions
{
    private static object GetPropertyValue(object o, string Name)
    {
        return o.GetType().GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).Where(x => x.Name == Name).First().GetValue(o, null);
    }
    public static string ToTraceString(this IQueryable query)
    {
        var oquery = (ObjectQuery)GetPropertyValue(GetPropertyValue(query, "InternalQuery"), "ObjectQuery");
        return oquery.ToTraceString();
    }
}

Usage:

   var rows = db.Forecasts.Take(1);
   System.Diagnostics.Debug.WriteLine(rows.ToTraceString());
查看更多
Deceive 欺骗
4楼-- · 2019-03-18 02:37

The extension method ToTraceString() might be what you're looking for:

http://msdn.microsoft.com/en-us/library/system.data.objects.objectquery.totracestring.aspx

查看更多
老娘就宠你
5楼-- · 2019-03-18 02:40

Setting up logging is as easy as:

context.Database.Log = Console.WriteLine;

Original answer: https://stackoverflow.com/a/20757916/2183503

查看更多
疯言疯语
6楼-- · 2019-03-18 02:46

You can try using Entity Framework tracing provider as described here (but it is old post for CTP3).

Your other choices are:

In common EF you can also use ToTraceString as @Andy suggested but DbQuery in CodeFirst doesn't have this method (or I didn't find it).

Edit:

So DbQuery doesn't have ToTraceString because it is directly implemented as ToString.

查看更多
登录 后发表回答