2009-05-20 5 views
0

Hier ist ein Code-SnippetWie Re-Order Auswertung dieses Linq Szenario

IEnumerable<Car> GetCars() 
{ 
    foreach(var request in RequestQueue()) 
    { 
     RemoveFromQueue(request); 
     yield return MakeCar(request);//Expensive 
    } 
} 

// Anwendungsszenario 1: Kein Problem

foreach(Car c in GetCars()) 
{ 
//Do stuff 
} 

// Anwendungsszenario 2: Problem Ich habe alle Autos gebaut, aber nur 1.

foreach(Car c in GetCars().Where(p=>p.Request.Id==10000)) 
{ 
//Do stuff 
} 

Ist es möglich, die Where-Klausel zu evaluieren, bevor ich ein Auto baue? Wie?

Offensichtlich kann die where-Klausel basierend auf der Client-Nutzung variieren.

Motivation: Wenn Sie Linq zu SQL ausführen, wird .Take (10) in Top (10) umgewandelt und die Abfrage wird auf dem Server ausgeführt. Ich möchte so etwas erreichen.

Antwort

0

Nicht sicher, ohne den Rest Ihres Codes zu sehen, aber was hält Sie davon ab?

Car GetCar(id) 
{ 
    Car result = default(Car); 

    // I am assuming that RequestQueue() is Enumerable? 
    Request request = RequestQueue().SingleOrDefault(p => p.Request.Id == id); 

    if(result != null) 
    { 
     RemoveFromQueue(request); 

     result = MakeCare(request); 
    } 

    return result; 
} 

Dann diese Methode verwenden, statt GetCar() und // etwas tun, aber es ist schwer zu wissen, ob dies ohne mehr den Codes zu sehen, funktionieren würde. Hoffe, das hilft ...

+0

eine Motivation zur Abfrage hinzugefügt, sehen, ob das hilft –

+0

Welcher Typ ist RequestQueue() ist es IQueryable, IEnumerable oder ... – bytebender

+0

ist IEnumerable –

1

@J.13.L 's Vorschlag ist wahrscheinlich der beste praktische: expose eine API, die ein einzelnes Auto bekommt.

Die Antwort auf Ihre letzte Frage darüber, wie .Take (10) in TOP 10 auf dem SQL-Server eingeht, ist, dass Sie einen IQueryable-Provider implementieren und den Ausdrucksbaum parsen müssen. Dies ist nicht sehr trivial, aber wenn Sie daran interessiert sind, zu lernen, wie, gibt es eine große Reihe von Artikeln über sie hier tun: