convert this LINQ expression into Lambda
Solution 1
To convert a Linq query to it's Lambda equivalent:
- Download Linqpad and run your query.
- In the results window, click on the "λ" button in the toolbar. It's right above the Results window
- Your query will be converted to a Lambda expression equivalent!
Solution 2
You can take a look at 101 LINQ Samples and C# 3.0 QUERY EXPRESSION TRANSLATION CHEAT SHEET
Solution 3
Here's the heuristic that I follow:
Favor LINQ expressions over lambdas when you have joins.
I think that lambdas with joins look messy and are difficult to read.
Solution 4
I usually use ReSharper to help me convert things to method chains and lambda's, which helps me go back and forth fairly easy.
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) };
And then using ReSharper's option of convert LINQ to method chain equals the following:
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
{
@t.@[email protected],
@t.@[email protected],
fname = ((@t.joinedFruit == null) ? string.Empty : @t.joinedFruit.fname),
vname = ((joinedVegg == null) ? string.Empty : joinedVegg.vname)
});
Granted the output is less then desirable, but It at least helps in starting somewhere on understanding the syntax.
Solution 5
Here’s how you might write this query in lambda:
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” }
};
Using query expression
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;
Using lambda expressions
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);
Both approach yields the same result (customer with company Id “AC” and customer Id “Customer1”), but as you can see, lambda expression is much harder to write and read!
Hope this helps!
RameshVel
தொட்டு விடும் தூரத்தில் வெற்றியும் இல்லை விட்டு விடும் எண்ணத்தில் நானும் இல்லை - ரமேஷ் வேல் building https://dailybasket.com/?utm_source=stackoverflow&utm_medium=stackoverflow&utm_campaign=stackoverflow_bio
Updated on July 20, 2020Comments
-
RameshVel almost 4 years
Guys, I have a hard time converting this below linq expression(left join implementation) to lambda expression (for learning).
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) };
Can some one suggest me how to do this.
And i really appreciate if someone give me the excellent tutorial links for "C# Lambdas & Linqs"
-
RameshVel over 14 yearsthanks jim for the reply. But i wanted to do this in lambda to get familiar with.. i mentioned that already its for learning...
-
RameshVel over 14 yearsthanks for the links Dzmitry... the cheat sheet is useful... i already have a look at 101 samples..
-
satyavrat over 14 yearsi thought that was only the paid version that had loads of samples etc
-
Mitch Wheat over 14 yearsThe free version comes with samples too.
-
RameshVel over 14 yearshey where would i get the source code for the 101 samples.. any idea.. i couldnt find there...
-
RameshVel over 14 yearsthanks Mark for your response.. i will run it over here and will let you know if that works..
-
atconway almost 11 yearsI have Linqpad but without creating a 'connection' to a service that I can query, I can not see the button for the lambda. I do not know how to just paste in a LINQ query and convert it to a lambda. Is this actually possible?
-
Brad Parks almost 11 yearsI just added a pic for where the button is in the UI. I don't have Linqpad on hand, but I think you need to have a runnable query there before it can be converted to a Lambda. In another post, I detailed how you can test data in Linqpad without needing a DB, here: stackoverflow.com/questions/4611031/…
-
Toolkit over 5 yearscan it convert SQL to lambda or LINQ? Doesn't seem to be working
-
Brad Parks over 5 yearsI haven't used it in a long time, but what does clicking the
SQL
button beside theλ
do?