2009-10-06 165 views
14

伙计们,我很难将下面的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#lambda表达式& Linqs”的优秀教程链接

回答

3

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

+0

我认为这只是付费版本,有负载的样品等 – Andrew 2009-10-06 10:53:11

+0

免费版本也带有样品。 – 2009-10-06 11:18:57

9

下面是我按照启发式:

青睐LINQ表达了lambda表达式时,你有加入。

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

+0

感谢jim的回复。但我想在拉姆达做到这一点,以熟悉..我提到已经它的学习... – RameshVel 2009-10-06 10:44:08

8

我通常使用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) }; 

,然后使用转换的LINQ to方法链的ReSharper的选项等于以下:

 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 2009-10-06 13:24:54

23

要转换LINQ查询到它的lambda相当于:

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

enter image description here

+0

我有Linqpad,但没有创建一个“连接”到我可以查询的服务,我看不到lambda的按钮。我不知道如何粘贴LINQ查询并将其转换为lambda。这实际上可能吗? – atconway 2013-07-19 15:15:04

+0

我刚刚在UI中添加了一个按钮位置的图片。我手上没有Linqpad,但我认为在它可以转换为Lambda之前,您需要有一个可运行的查询。在另一篇文章中,我详细介绍了如何在Linqpad中测试数据而不需要数据库,在这里:http://stackoverflow.com/questions/4611031/convert-json-string-to-c-sharp-object/7446542#7446542 – 2013-07-19 15:31:20

4

这里是你会如何写这个查询的Lambda:

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; 

使用Lambda表达式

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”),但正如您所看到的,lambda表达式更难以书写和阅读!

希望这会有所帮助!