2009-10-06 19 views
14

Faceci, ciężko mi konwertować to wyrażenie poniżej linq (implementacja lewostworzenia) do wyrażenia lambda (do nauki).przekonwertuj to wyrażenie LINQ na 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) }; 

Czy ktoś może mi zasugerować, jak to zrobić.

i naprawdę doceniam, gdy ktoś daje mi doskonałe połączenia poradnik dla "C# lambda & Linqs"

Odpowiedz

3

Pobierz LINQPad; jest dostarczany z wbudowanymi próbkami do nauki LINQ.

+0

Myślałem, że to była tylko płatna wersja, która miała mnóstwo próbek itp. – Andrew

+0

Darmowa wersja zawiera również próbki. –

9

Oto heurystyczne, które śledzę: wyrażenia

Favor LINQ nad lambdas gdy masz przyłącza.

Myślę, że lambdy z łączeniami wyglądają na brudne i trudno je odczytać.

+0

dzięki jim za odpowiedź. Ale chciałem zrobić to w języku lambda, aby zapoznać się z ... Wspomniałem już o tym, że już się uczę ... – RameshVel

8

Zwykle używam programu ReSharper, aby pomóc mi konwertować elementy do łańcuchów metod i łańcuchów lambda, co pomaga mi w dość prostym tempie.

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) }; 

A następnie za pomocą opcji ReSharper za konwertowania LINQ do łańcucha metoda równa się co następuje:

 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) 
            }); 

prawda wyjście jest mniej niż pożądane, ale przynajmniej pomaga w rozpoczęciu gdzieś na zrozumieniu składnię.

+0

dziękuję Mark za odpowiedź .. uruchomię to tutaj i dam ci znać, czy to zadziała .. – RameshVel

23

Aby przekonwertować kwerendy LINQ to Lambda równoważne:

  1. Pobierz Linqpad i uruchomić zapytanie .
  2. W oknie wyników kliknij przycisk na przycisku "λ" na pasku narzędzi. Znajduje się nad oknem wyników.
  3. Twoje zapytanie zostanie przekonwertowane na równoważnik wyrażenia Lambda !

enter image description here

+0

I mieć Linqpad, ale bez tworzenia "połączenia" z usługą, którą mogę wykonać, nie widzę przycisku dla lambda. Nie wiem, jak wkleić zapytanie LINQ i przekonwertować je do lambda. Czy to rzeczywiście możliwe? – atconway

+0

Właśnie dodałem zdjęcie, na którym znajduje się przycisk w interfejsie użytkownika. Nie mam Linqpad pod ręką, ale myślę, że musisz mieć tam wykonalne zapytanie, zanim będzie można je przekonwertować na Lambda. W innym poście wyjaśniłem, jak możesz przetestować dane w Linqpad bez potrzeby korzystania z DB, tutaj: http://stackoverflow.com/questions/4611031/convert-json-string-to-c-sharp-object/7446542#7446542 –

4

Oto jak można napisać tej kwerendy w lambda:

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” } 
}; 

Korzystanie wyrażenie kwerendy

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; 

Korzystanie z wyrażeń lambda

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); 

Obie metody dają ten sam wynik (klient z identyfikatorem firmy "AC" i identyfikatorem klienta "Klient 1"), ale jak widać, wyrażenie lambda jest znacznie trudniejsze do napisania i odczytania!

Mam nadzieję, że to pomoże!