2009-10-06 167 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表達式更難以書寫和閱讀!

希望這會有所幫助!