2009-10-06 2 views
14

Ребята, мне сложно преобразовать это выражение linq (левое объединение) в выражение лямбда (для обучения).преобразовать это выражение LINQ в 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) }; 

Может кто-нибудь предложить мне, как это сделать.

И я очень признателен, если кто-то мне отличные ссылки учебник для «C# Лямбдами & Linqs»

ответ

3

Скачать LINQPad может; он поставляется со встроенными образцами для обучения LINQ.

+0

Я думал, что это была только платная версия с множеством образцов и т. д. – Andrew

+0

Бесплатная версия поставляется с образцами. –

9

Вот эвристика, что я следую:

Фавор LINQ выражения над лямбды, когда у вас есть соединения.

Я думаю, что лямбды с соединениями выглядят грязными и их трудно читать.

+0

благодарит Джима за ответ. Но я хотел сделать это в лямбда, чтобы познакомиться с ... я упомянул об этом уже для обучения ... – RameshVel

8

Обычно я использую ReSharper, чтобы помочь мне преобразовать вещи в цепи методов и лямбда, что помогает мне легко и быстро идти туда и обратно.

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

И затем, используя опцию ReSharper по новообращенного LINQ к методу цепи составляет следующее:

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

Предоставленный выход менее желательно, но он по крайней мере, помогает в запуске где-то на понимание синтаксиса.

+0

благодарит Марка за ваш ответ .. я запустил его здесь и расскажу, если это сработает. – RameshVel

23

Для преобразования запроса Linq в это Lambda эквивалент:

  1. Скачать Linqpad и запустить запрос.
  2. В окне результатов нажмите на кнопке «λ» на панели инструментов. Это прямо над результатами поиска
  3. Ваш запрос будет преобразован в эквивалент выражения Lambda! !

enter image description here

+0

I есть Linqpad, но не создавая «соединение» с сервисом, который я могу запросить, я не вижу кнопку для лямбда. Я не знаю, как просто вставить запрос LINQ и преобразовать его в лямбда. Возможно ли это? – atconway

+0

Я только что добавил картинку, где кнопка находится в пользовательском интерфейсе. У меня нет Linqpad под рукой, но я думаю, что перед этим его нужно преобразовать в Lambda. В другом посте я подробно рассказал, как вы можете тестировать данные в Linqpad без необходимости в БД, здесь: http://stackoverflow.com/questions/4611031/convert-json-string-to-c-sharp-object/7446542#7446542 –

4

Вот как вы могли бы написать этот запрос в лямбда:

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

Используя выражение запроса

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; 

Использование лямбда-выражений

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

Оба подхода дают тот же результат (клиент с идентификатором компании «AC» и идентификатором клиента «Customer1»), но, как вы можете видеть, выражение лямбда намного сложнее написать и прочитать!

Надеюсь, это поможет!

Смежные вопросы