Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What state is saved between rerunning queries in Linqpad?

Tags:

linqpad

What state is saved between rerunning queries in Linqpad? I presumed none, so if you run a script twice it will have the same results both time.

However run the C# Program below twice in the same Linqpad tab. You'll find the first it prints an empty list, the second time a list with the message 'hey'. What's going on?


System.ComponentModel.TypeDescriptor.GetAttributes(typeof(String)).OfType<ObsoleteAttribute>().Dump();  
System.ComponentModel.TypeDescriptor.AddAttributes(typeof(String),new ObsoleteAttribute("hey"));
like image 881
Colonel Panic Avatar asked Oct 22 '12 11:10

Colonel Panic


1 Answers

LINQPad caches the application domain between queries, unless you request otherwise in Edit | Preferences (or press Ctrl+Shift+F5 to clear the app domain). This means that anything stored in static variables will be preserved between queries, assuming the types are numerically identical. This is why you're seeing the additional type description attribute in your code, and also explains why you often see a performance advantage on subsequent query runs (since many things are cached one way or another in static variables).

You can take advantage of this explicitly with LINQPad's Cache extension method:

var query = <someLongRunningQuery>.Cache();
query.Select (x => x.Name).Dump();

Cache() is a transparent extension method that returns exactly what it was fed if the input was not already seen in a previous query. Otherwise, it returns the enumerated result from the previous query.

Hence if you change the second line and re-execute the query, the query will execute quickly since will be supplied from a cache instead of having to re-execute.

like image 120
Joe Albahari Avatar answered Nov 15 '22 11:11

Joe Albahari