2009-10-06 13 views
14

Guys, ich habe eine harte Zeit umwandeln dies unter linq Ausdruck (linke Join-Implementierung) zu Lambda-Ausdruck (zum Lernen).konvertieren Sie diesen LINQ-Ausdruck in Lambda

var result = from g in grocery 
     join f in fruit on g.fruitId equals f.fruitId into tempFruit 
     join v in veggie on g.vegid equals v.vegid into tempVegg 
     from joinedFruit in tempFruit.DefaultIfEmpty() 
     from joinedVegg in tempVegg.DefaultIfEmpty() 
     select new { g.fruitId, g.vegid, fname = ((joinedFruit == null) ? string.Empty :  joinedFruit.fname), vname = ((joinedVegg == null) ? string.Empty : joinedVegg.vname) }; 

Kann jemand mir vorschlagen, wie man das macht.

Und ich wirklich zu schätzen, wenn jemand mir die hervorragende Anleitung Links gibt für "C# Lambda-Ausdrücke & Linqs"

Antwort

3

Herunterladen LINQPad; Es enthält integrierte Beispiele zum Lernen von LINQ.

+0

Ich dachte, das war nur die kostenpflichtige Version, die viele Proben usw. hatte – Andrew

+0

Die kostenlose Version kommt mit Proben zu. –

3

Verwenden Reflector NET :)

9

Hier ist die Heuristik, die ich wie folgt vor:

Favor LINQ Ausdrücke über Lambda-Ausdrücke, wenn Sie schließt sich haben.

Ich denke, dass Lambdas mit Joins chaotisch aussehen und schwer zu lesen sind.

+0

danke Jim für die Antwort. Aber ich wollte dies in Lambda tun, um sich mit ... vertraut zu machen. Ich erwähnte das bereits sein für das Lernen ... – RameshVel

8

Normalerweise verwende ich ReSharper, um mir dabei zu helfen, Dinge in Methodenketten und Lambdas umzuwandeln, was mir hilft, ziemlich einfach hin und her zu gehen.

var result = from g in grocery 
       join f in fruit on g.fruitId equals f.fruitId into tempFruit 
       join v in veggie on g.vegid equals v.vegid into tempVegg 
       from joinedFruit in tempFruit.DefaultIfEmpty() 
       from joinedVegg in tempVegg.DefaultIfEmpty() 
       select new { g.fruitId, g.vegid, fname = ((joinedFruit == null) ? string.Empty : joinedFruit.fname), vname = ((joinedVegg == null) ? string.Empty : joinedVegg.vname) }; 

Und dann ReSharper die Möglichkeit, konvertieren LINQ to Methode Kette mit gleich dem folgenden:

 var result =grocery .GroupJoin(fruit, g => g.fruitId, f => f.fruitId, (g, tempFruit) => new {g, tempFruit}) 
          .GroupJoin(veggie, @t => @t.g.vegid, v => v.vegid, (@t, tempVegg) => new {@t, tempVegg}) 
          .SelectMany(@t => @[email protected](), (@t, joinedFruit) => new {@t, joinedFruit}) 
          .SelectMany(@t => @[email protected](),(@t, joinedVegg) => 
           new 
            { 
             @[email protected]@t.g.fruitId, 
             @[email protected]@t.g.vegid, 
             fname = ((@t.joinedFruit == null) ? string.Empty : @t.joinedFruit.fname), 
             vname = ((joinedVegg == null) ? string.Empty : joinedVegg.vname) 
            }); 

Zugegeben der Ausgang dann wünschenswert, weniger ist, aber es hilft, zumindest in irgendwo Start der Syntax auf das Verständnis.

+0

danke Mark für Ihre Antwort .. ich werde es hier laufen lassen und Sie wissen lassen, ob das funktioniert .. – RameshVel

23

eine Linq Abfrage zu konvertieren, um sie gleichwertig Lambda ist:

  1. Herunterladen Linqpad und Ihre Abfrage ausführen.
  2. Klicken Sie im Ergebnisfenster auf die Schaltfläche "λ" in der Symbolleiste auf . Es ist direkt über dem Ergebnisfenster
  3. Ihre Abfrage wird in eine Lambda-Ausdruck Äquivalent konvertiert werden!

enter image description here

+0

I habe Linqpad, aber ohne eine "Verbindung" zu einem Dienst zu erstellen, den ich abfragen kann, kann ich die Schaltfläche für das Lambda nicht sehen. Ich weiß nicht, wie man einfach eine LINQ-Abfrage einfügt und sie in ein Lambda konvertiert. Ist das tatsächlich möglich? – atconway

+0

Ich habe gerade ein Bild für die Schaltfläche in der Benutzeroberfläche hinzugefügt. Ich habe Linqpad nicht zur Hand, aber ich denke, dass Sie dort eine runable Abfrage haben müssen, bevor es in ein Lambda umgewandelt werden kann. In einem anderen Beitrag habe ich detailliert beschrieben, wie Sie Daten in Linqpad testen können, ohne eine Datenbank zu benötigen: http://stackoverflow.com/questions/4611031/convert-json-string-to-c-sharp-object/7446542#7446542 –

4

Hier ist, wie Sie diese Abfrage in Lambda schreiben könnte:

var cus­tomers = new List { 
new Cus­tomer { Com­pa­nyId = “AC”, Cus­tomerId = “Customer1” }, 
new Cus­tomer { Com­pa­nyId = “not-AC”, Cus­tomerId = “Customer2” }, 
}; 

var user­Cus­tomers = new List { 
new User­Cus­tomer { Com­pa­nyId = “AC”, Cus­tomerId = “Customer1”, User = “not-admin” }, 
new User­Cus­tomer { Com­pa­nyId = “AC”, Cus­tomerId = “Customer1”, User = “admin” }, 
new User­Cus­tomer { Com­pa­nyId = “AC”, Cus­tomerId = “Customer2”, User = “not-admin” }, 
new User­Cus­tomer { Com­pa­nyId = “AC”, Cus­tomerId = “Customer2”, User = “admin” }, 
new User­Cus­tomer { Com­pa­nyId = “not-AC”, Cus­tomerId = “Customer1”, User = “not-admin”  }, 
new User­Cus­tomer { Com­pa­nyId = “not-AC”, Cus­tomerId = “Customer1”, User = “admin” }, 
new User­Cus­tomer { Com­pa­nyId = “not-AC”, Cus­tomerId = “Customer2”, User = “not-admin” }, 
new User­Cus­tomer { Com­pa­nyId = “not-AC”, Cus­tomerId = “Customer2”, User = “admin” } 
}; 

Mit Abfrageausdruck

var query = 
from c in cus­tomers 
join uc in user­Cus­tomers on 
new { c.CompanyId, c.CustomerId } equals new { uc.CompanyId, uc.CustomerId } 
where c.CompanyId == “AC” && uc.User == “admin“ 
select c; 

Mit Lambda-Ausdrücke

var lambda = cus­tomers.Where(c => c.CompanyId == “AC”) // inner sequence 
.Join(userCustomers.Where(uc => uc.User == “admin”), // outer sequence 
c => new { c.CompanyId, c.CustomerId }, // inner key selec­tor 
uc => new { uc.CompanyId, uc.CustomerId }, // outer key selec­tor 
(c, uc) => c); 

Beide Ansatz führt zum gleichen Ergebnis (Kunde mit Firmen-ID "AC" und Kunden-ID "Customer1"), aber wie Sie sehen können, ist Lambda-Ausdruck viel schwerer zu schreiben und zu lesen!

Hoffe, das hilft!

Verwandte Themen