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

有人可以建议我如何做到这一点。

如果有人给我“C#Lambdas&Linqs”的优秀教程链接,我真的很感激

要将Linq查询转换为它的等效Lambda:

  1. 下载Linqpad并运行您的查询。
  2. 在结果窗口中,单击工具栏中的“λ”按钮。 它位于“结果”窗口的正上方
  3. 您的查询将转换为等效的Lambda表达式!

在此处输入图像描述

您可以查看101 LINQ Samples和C#3.0 QUERY EXPRESSION TRANSLATION CHEAT SHEET

这是我遵循的启发式:

当你有连接时,喜欢lambdas上的LINQ表达式。

我认为连接的lambdas看起来很乱,很难阅读。

我通常使用ReSharper来帮助我将事物转换为方法链和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) }; 

然后使用ReSharper将LINQ转换为方法链的选项等于以下内容:

  var result =grocery .GroupJoin(fruit, g => g.fruitId, f => f.fruitId, (g, tempFruit) => new {g, tempFruit}) .GroupJoin(veggie, @t => @tgvegid, v => v.vegid, (@t, tempVegg) => new {@t, tempVegg}) .SelectMany(@t => @t.@t.tempFruit.DefaultIfEmpty(), (@t, joinedFruit) => new {@t, joinedFruit}) .SelectMany(@t => @t.@t.tempVegg.DefaultIfEmpty(),(@t, joinedVegg) => new { @t.@t.@tgfruitId, @t.@t.@tgvegid, fname = ((@t.joinedFruit == null) ? string.Empty : @t.joinedFruit.fname), vname = ((joinedVegg == null) ? string.Empty : joinedVegg.vname) }); 

当然,输出不太合乎需要,但它至少有助于在理解语法的某个地方开始。

以下是您在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” } }; 

使用查询表达式

 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; 

使用lambda表达式

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

两种方法都会产生相同的结果(客户公司ID为“AC”,客户ID为“Customer1”),但正如您所看到的,lambda表达式更难以编写和读取!

希望这可以帮助!

下载LINQPad ; 它内置了用于学习LINQ的示例。

使用Reflector .NET 🙂