31
LINQ, Take Two Realizing the LINQ to Everything Dream Bart J.F. De Smet blogs.bartdesmet.net/bart [email protected]

LINQ , Take Two Realizing the LINQ to Everything Dream

  • Upload
    uri

  • View
    77

  • Download
    0

Embed Size (px)

DESCRIPTION

LINQ , Take Two Realizing the LINQ to Everything Dream. Bart J.F. De Smet blogs.bartdesmet.net/bart [email protected] . A Historical Perspective. 5 years ago. Little recent innovation. Where’s the cloud ?. Censored. Language Integrated Query. Monads. Why?. What?. How?. - PowerPoint PPT Presentation

Citation preview

Page 1: LINQ , Take  Two Realizing the  LINQ to Everything Dream

LINQ, Take TwoRealizing the LINQ to Everything DreamBart J.F. De Smetblogs.bartdesmet.net/[email protected]

Page 2: LINQ , Take  Two Realizing the  LINQ to Everything Dream

Censored

5 years ago

Little recent innovation

Where’s the cloud?

A Historical Perspective

Page 3: LINQ , Take  Two Realizing the  LINQ to Everything Dream

Why?

What?How?

Language Integrated QueryMonads

Page 4: LINQ , Take  Two Realizing the  LINQ to Everything Dream

IEnumerable<T>

IQueryable<T>new[]{ 42 }

SelectManyIEnumerable<R> SelectMany<T, R>( this IEnumerable<T> source, Func<T, IEnumerable<R>> selector)

Could there be more?

Also see www.codeplex.com/LINQSQO for “Project MinLINQ”

The Monadic Bind Operator Revealed

Page 5: LINQ , Take  Two Realizing the  LINQ to Everything Dream

from _ in namefrom s in _.ToUpper()select s

name.SelectMany( _ => _.ToUpper(), s => s)Compiler

Null-propagating dotstring s =

name?.ToUpper();

Syntactic sugar

One single library function

suffices

Building the Maybe Monad (For Fun and No Profit)

Page 6: LINQ , Take  Two Realizing the  LINQ to Everything Dream

DEMOEssential LINQ

Page 7: LINQ , Take  Two Realizing the  LINQ to Everything Dream

var src = new Source<Product>();

var res = from p in src where p.Price > 100m group p by p.Category;

foreach (var p in res) Console.WriteLine(p);

ImplementsIQueryable<T

>

Compiles fine

Does it really have to be a runtime check?

Query Providers Revisited – Do We Need IQueryable<T>?

Page 8: LINQ , Take  Two Realizing the  LINQ to Everything Dream

var res = from p in src where p.Price > 100m group p by p.Category;

var res = src .Where(p => p.Price > 100m) .GroupBy(p => p.Category);

Syntactic sugar

Can be instance methods

Source<T> Filtered<T> Projected<T>

Where Select

No GroupBy “edge”

Leveraging The Query Pattern

Page 9: LINQ , Take  Two Realizing the  LINQ to Everything Dream

var res = from tweet in twitter

where tweet.AboutFromLocation

== “Bart”From

From

AboutLocation

== “LINQ”About

where tweet. About

Query “learns”

class Twitter{ public TwitterByFrom Where(Func<TweetAboutFromLoc, FilterFrom> filter); // Other filter methods}

Recipe

Method overloadsType state machineOperator overloads“Has a” type From operator overloadingclass TwitterByFrom

{ public TwitterByAboutFrom Where(Func<TweetAboutLoc, FilterAbout> filter); // Other filter methods // Fields with current filters}

select tweet;

Custom syntax trees

class TweetAboutLoc{ public AboutString About; public LocString Location;}

class AboutString{ FilterAbout operator ==( AboutString f, string s)}

class TweetAboutFromLoc{ public FromString From; public AboutString About; public LocString Location;}

class FromString{ FilterFrom operator ==( FromString f, string s)}

Taking It One Step Further

Page 10: LINQ , Take  Two Realizing the  LINQ to Everything Dream

DEMOQuery Providers Revisited

Page 11: LINQ , Take  Two Realizing the  LINQ to Everything Dream

Event Processing Systems

Rx is a library for composing asynchronous

and event-based programs using observable

sequences.

( 𝑓 ◦𝑔)(𝑥 )= 𝑓 (𝑔(𝑥 ))

Queries! LINQ!

Way simpler with Rx

• .NET 3.5 SP1 and 4.0• Silverlight 3, 4, and 5• XNA 4.0 for Xbox 360• Windows Phone 7• JavaScript (RxJS)

Download at MSDN Data Developer Center or use NuGet

Page 12: LINQ , Take  Two Realizing the  LINQ to Everything Dream

Environment

Mov

eNex

tGot next?

Application

OnN

ext Have next!

IEnumerable<T>IEnumerator<T>

IObservable<T>IObserver<T>

Inte

racti

ve ReactivePush-Based Data Retrieval

Page 13: LINQ , Take  Two Realizing the  LINQ to Everything Dream

Event Programming Interfaces

interface IObservable<out T>{ IDisposable Subscribe(IObserver<T> observer);}

interface IObserver<in T>{ void OnNext(T value); void OnError(Exception ex); void OnCompleted();}

Both interfaces ship in the .NET 4 BCL

Page 14: LINQ , Take  Two Realizing the  LINQ to Everything Dream

Fixe

d(M

SIL)

Tran

slata

ble

(Exp

ress

ion

tree

s)

ToQueryable

ToObservable

ToEnumerable

AsQ

uery

able

AsEnumerable As

Qbs

erva

ble

AsObservable

Pull(interactive)

Push(reactive)

Concurre

ncy

(ISch

eduler)

LINQ to *.*

What?

Where?

How

?

Worker pools Message loopsThreads Distributed

Duality

Hom

o-ic

onic

IQbservable<T>LINQ to WMI Events

ToQbservableIQueryable<T>

LINQ to SQL

IEnumerable<T>LINQ to Objects

IObservable<T>LINQ to Events

Page 15: LINQ , Take  Two Realizing the  LINQ to Everything Dream

IQbservable<T> – The Dual of IQueryable<T>

We welcome semantic

discussions

Extended role for some operators

No Execute method

interface IQbservable<out T> : IObservable<T>{ Expression Expression { get; } Type ElementType { get; } IQbservableProvider Provider { get; }}

interface IQbservableProvider{ IQbservable<R> CreateQuery<R>(Expression expression);}

Page 16: LINQ , Take  Two Realizing the  LINQ to Everything Dream

DEMOLINQ to WMI Events (WQL)

Page 17: LINQ , Take  Two Realizing the  LINQ to Everything Dream

Rx and the Visual Studio Async CTP

• The essence of the feature

• Feature based on the “await-pattern”• Awaiting Task<T>• Returns the single result (of type T)

• Awaiting IObservable<T>?• We return the last result (of type T)• Want all values? Use ToList() first!

async Task<int> GetLength(Task<string> name){ string n = await name; return n.Length;}

Asynchronously computed value

Can await a “future” value

Result is async too

Page 18: LINQ , Take  Two Realizing the  LINQ to Everything Dream

Asynchronous Pull-Based Data Access?

• Await feature is about sequential code• Great for single-valued computations• What about asynchronous pull-based data collections?

public interface IAsyncEnumerable<T>{ IAsyncEnumerator<T> GetEnumerator();}

public interface IAsyncEnumerator<T> : IDisposable{ T Current { get; } Task<bool> MoveNext();}

Can await

Rx definesQuery

Operators

Page 19: LINQ , Take  Two Realizing the  LINQ to Everything Dream

DEMORx support for C# and VB “await”

Page 20: LINQ , Take  Two Realizing the  LINQ to Everything Dream

Where Execution Happens – Introducing Schedulers

Rx’s unified way tointroduce concurrency

IEnumerable<T> IObservable<T>

Synchronous Asynchronous

ToObservable

ToEnumerable

interface IScheduler{ DateTimeOffset Now { get; } IDisposable Schedule<T>(T state, Func<IScheduler, T, IDisposable> action); IDisposable Schedule<T>(T state, TimeSpan dueTime, Func<IScheduler, T, IDisposable> action); IDisposable Schedule<T>(T state, DateTimeOffset dueTime, Func<IScheduler, T, IDisposable> action);}

Page 21: LINQ , Take  Two Realizing the  LINQ to Everything Dream

Imported TextBox TextChanged event

Asynchronous web service call

Use of scheduler to synchronize

res.ObserveOn(new ControlScheduler(frm)).Subscribe(words =>{ lst.Items.Clear(); lst.Items.AddRange((from word in words select word.Word).ToArray());});

res.Subscribe(words =>{ lst.Items.Clear(); lst.Items.AddRange((from word in words select word.Word).ToArray());});

Indicates where things run

IScheduler Specifies Where Things Happen

var res = from word in input.DistinctUntilChanged() .Throttle(TimeSpan.FromSeconds(0.5)) from words in lookup(word) select words;

Page 22: LINQ , Take  Two Realizing the  LINQ to Everything Dream

Baked in notion of “where”?

foreach (var p in res.RemoteOn(new SqlScheduler(“server”))) // Process product

Decoupled “what” from “where”

Entry-point for the schema

Custom schedulers could be very rich (e.g.

server farm)

IScheduler Parameterization

var ctx = new NorthwindDataContext(); var res = from product in ctx.Products where product.Price > 100m select product.Name;

Page 23: LINQ , Take  Two Realizing the  LINQ to Everything Dream

Expression Tree Remoting

Rx .NET

RxJS stocks.Where(function (t) { return t.Symbol == “MSFT”; }).Select(function (t) { return t.Quote; })

JSON serializer

Observable data source

Retargeting to AJAX

from ticker in stockswhere ticker.Symbol == “MSFT”select ticker.Quote

Page 24: LINQ , Take  Two Realizing the  LINQ to Everything Dream

DEMORemoting of Query Expressions

Page 25: LINQ , Take  Two Realizing the  LINQ to Everything Dream

LINQ to the Unexpected

Model[ Decisions[Reals, SA, VZ], Goals[ Minimize[20 * SA + 15 * VZ] ], Constraints[ C1 -> 0.3 * SA + 0.4 * VZ >= 2000, C2 -> 0.4 * SA + 0.2 * VZ >= 1500, C3 -> 0.2 * SA + 0.3 * VZ >= 500, C4 -> SA <= 9000, C5 -> VZ <= 6000, C6 -> SA >= 0, C7 -> VZ >= 0 ]]

from m in ctx.CreateModel(new { vz = default(double), sa = default(double)})where 0.3 * m.sa + 0.4 * m.vz >= 2000 && 0.4 * m.sa + 0.2 * m.vz >= 1500 && 0.2 * m.sa + 0.3 * m.vz >= 500where 0 <= m.sa && m.sa <= 9000 && 0 <= m.vz && m.vz <= 6000orderby 20 * m.sa + 15 * m.vzselect m

To compute call Solve

Non-persistent

Cost / barrel

Max# barrels

Min# barrels

Refin

emen

t %

Page 26: LINQ , Take  Two Realizing the  LINQ to Everything Dream

LINQ to the Unexpected

from costSA in GetPriceMonitor("SA")from costVZ in GetPriceMonitor("VZ")

from m in ctx.CreateModel( new { vz = default(double), sa = default(double) })where 0.3 * m.sa + 0.4 * m.vz >= 2000 && 0.4 * m.sa + 0.2 * m.vz >= 1500 && 0.2 * m.sa + 0.3 * m.vz >= 500where 0 <= m.sa && m.sa <= 9000 && 0 <= m.vz && m.vz <= 6000

orderby costSA * m.sa + costVZ * m.vzselect m

Observabledata sources

Sele

ctM

any

Parametersto decision

Subscribe here!

Page 27: LINQ , Take  Two Realizing the  LINQ to Everything Dream

DEMOTheorem Solving using Z3

Page 28: LINQ , Take  Two Realizing the  LINQ to Everything Dream

A Futuristic Perspective

Censored

Next 5 years

Rx and Ix are here

Remoting Async

Solvers

ToolkitsScheduler

Page 29: LINQ , Take  Two Realizing the  LINQ to Everything Dream

Stay up to date with MSDN Belux

• Register for our newsletters and stay up to date:http://www.msdn-newsletters.be• Technical updates• Event announcements and registration• Top downloads

• Follow our bloghttp://blogs.msdn.com/belux

• Join us on Facebookhttp://www.facebook.com/msdnbehttp://www.facebook.com/msdnbelux

• LinkedIn: http://linkd.in/msdnbelux/ • Twitter: @msdnbelux

Download MSDN/TechNet Desktop Gadget

http://bit.ly/msdntngadget

Page 30: LINQ , Take  Two Realizing the  LINQ to Everything Dream

TechDays 2011 On-Demand

• Watch this session on-demand via Channel9http://channel9.msdn.com/belux

• Download to your favorite MP3 or video player• Get access to slides and recommended resources by the speakers

Page 31: LINQ , Take  Two Realizing the  LINQ to Everything Dream

THANK YOU