Ayende @ Rahien

It's a girl

L2S Prof hardships – getting query duration and row counts

I really want to be able to provide duration & row count for Linq to Sql. It has became a personal goal of mine.

The problem is that there is absolutely no open extensibility points within L2S that would allow it. The solution is… to  break down the wall. If you don’t have extensibility points, then I will make some.

image

And, you know what? I did:

image

The problem is that it took almost 12 hours to get it to this point, and along the way I had to build a new provider for Linq to Sql. And yes, that is not possible. Not isn’t supposed to be possible, just is not possible.

To get this to work I had to build a hack on top of a crack on top of a very angry duck.

image

I have been working on this for the last 12 hours, and this is about the most unsupported method that you could find to hook into things (I had to break the CLR type system to get this to work, and the things that I do with reflection are probably amoral in at least three different religions).

The problem with going with that route is that now I have to delay the public beta for L2S Prof. The good thing is that I can now provide additional information about Linq to SQL.

Comments

dan
11/16/2009 10:44 AM by
dan

ha! best post ever!

Imran
11/16/2009 12:42 PM by
Imran

Wonder if there is anyway to hook in to the client statistics that are generated when queries are run (e.g. the stats the management studio shows when you turn on the 'include client statistics' option).

Ayende Rahien
11/16/2009 03:01 PM by
Ayende Rahien

Imran,

That is probably too expensive to do on tool that emphasis low footprint on the profiled app

Dan L
11/16/2009 05:20 PM by
Dan L

That's hilarious. In my experience with L2S, coercive hook ins have become a somewhat typical necessity.

Chris Smith
11/16/2009 06:35 PM by
Chris Smith

Another reason B&D languages should go away! It makes it hard for you to get to the good stuff (and change it).

Bring on C# 6... which will resemble python with a C syntax.

tobi
11/17/2009 01:01 AM by
tobi

@"Chris Smith": There is a reason the stuff ayende changed using reflection is private. Imagine everything would be public: People would rely on internals all the time. The .net framework code would be unchangeable in even the simplest detail.

Fabian Schmied
11/17/2009 08:03 AM by
Fabian Schmied

Okay, I'll give in and ask the question: What do you mean by you "had to break the CLR type system to get this to work"?

I'd guess you could do a few things by using transparent proxies and injecting them via reflection, but I wouldn't consider this as a breaking of the type system.

You could also use Reflection.Emit to implement some internal interfaces (hoping that the accessibility flags won't be verified at runtime, of which I'm not sure). This actually is cheating the type system (if it works), but I'm not sure whether this is what you did.

So what's behind that ominous phrase? :)

Ayende Rahien
11/17/2009 08:08 AM by
Ayende Rahien

Fabian,

You can't actually implement internal interfaces using SRE, that is the first thing that I tried, and it doesn't work.

What I mean by breaking the type system is creating a type that lies about what it is.

When you ask it "are you a Foo", it will say yes, and when you ask it, "are you Bar" (totally unrelated to Foo) it will say yes as well.

It is a lying type, basically, and a nasty one that relies on specific usage pattern.

Harry S.
11/17/2009 11:45 PM by
Harry S.

Once again, the blogs tagline is very apt.

Bee
11/18/2009 07:37 PM by
Bee

Ayende, can you detail the process a little bit more?

In a topic complete away from profiller stuff, I have great interest in such thing

Comments have been closed on this topic.