Преобразовать это выражение 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"
Ответы
Ответ 1
Чтобы преобразовать к нему запрос Linq Лямбда-эквивалент:
- Загрузите Linqpad и запустите свой
запрос.
- В окне результатов нажмите
на кнопке "λ" на панели инструментов.
Он находится прямо над окном "Результаты"
- Ваш запрос будет преобразован в
Лямбда-выражение эквивалентно!
![enter image description here]()
Ответ 2
Вы можете взглянуть на 101 LINQ Samples и С# 3.0 QUERY ЭКСПРЕССИОННЫЙ ПЕРЕВОД ШАХТА
Ответ 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 customers = new List {
new Customer { CompanyId = "AC", CustomerId = "Customer1" },
new Customer { CompanyId = "not-AC", CustomerId = "Customer2" },
};
var userCustomers = new List {
new UserCustomer { CompanyId = "AC", CustomerId = "Customer1", User = "not-admin" },
new UserCustomer { CompanyId = "AC", CustomerId = "Customer1", User = "admin" },
new UserCustomer { CompanyId = "AC", CustomerId = "Customer2", User = "not-admin" },
new UserCustomer { CompanyId = "AC", CustomerId = "Customer2", User = "admin" },
new UserCustomer { CompanyId = "not-AC", CustomerId = "Customer1", User = "not-admin" },
new UserCustomer { CompanyId = "not-AC", CustomerId = "Customer1", User = "admin" },
new UserCustomer { CompanyId = "not-AC", CustomerId = "Customer2", User = "not-admin" },
new UserCustomer { CompanyId = "not-AC", CustomerId = "Customer2", User = "admin" }
};
Использование выражения запроса
var query =
from c in customers
join uc in userCustomers on
new { c.CompanyId, c.CustomerId } equals new { uc.CompanyId, uc.CustomerId }
where c.CompanyId == "AC" && uc.User == "admin"
select c;
Использование лямбда-выражений
var lambda = customers.Where(c => c.CompanyId == "AC") // inner sequence
.Join(userCustomers.Where(uc => uc.User == "admin"), // outer sequence
c => new { c.CompanyId, c.CustomerId }, // inner key selector
uc => new { uc.CompanyId, uc.CustomerId }, // outer key selector
(c, uc) => c);
Оба подхода дают тот же результат (клиент с идентификатором компании "AC" и идентификатором клиента "Customer1" ), но, как вы можете видеть, выражение лямбда намного сложнее написать и прочитать!
Надеюсь, это поможет!
Ответ 6
Загрузить LINQPad; он поставляется со встроенными образцами для обучения LINQ.
Ответ 7
Использовать Reflector.NET:)