Подтвердить что ты не робот

Преобразовать это выражение LINQ в Lambda

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

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

И я очень ценю, если кто-то даст мне отличные ссылки на учебники для "С# Lambdas и Linqs"

4b9b3361

Ответ 1

Чтобы преобразовать к нему запрос Linq Лямбда-эквивалент:

  • Загрузите Linqpad и запустите свой запрос.
  • В окне результатов нажмите на кнопке "λ" на панели инструментов. Он находится прямо над окном "Результаты"
  • Ваш запрос будет преобразован в Лямбда-выражение эквивалентно!

enter image description here

Ответ 3

Здесь эвристика, которой я следую:

Используйте выражения LINQ над lambdas, когда у вас есть соединения.

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

Ответ 4

Я обычно использую 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)
                                    });

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

Ответ 5

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

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" ), но, как вы можете видеть, выражение лямбда намного сложнее написать и прочитать!

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

Ответ 6

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

Ответ 7

Использовать Reflector.NET:)