2012-12-03 104 views
7

看起來大多數LINQ是用lambda表達式編寫的。我該如何着手使用lambda重寫這個linq,有點混淆樣式(尤其是與連接)?如何使用lambda表達式連接重寫此LINQ?

var responses = 
      from c in questionRepository.GetReponses() 
      join o in questionRepository.GetQuestions() on 
      c.QuestionID equals o.QuestionID 
      where c.UserID == 9999 
      orderby o.DisplayOrder 
     select new { o.QuestionText, c.AnswerValue }; 
+0

你真的不需要重寫它,它很好,因爲它是誠實的。 etimes我使用一種風格,有時使用另一種風格,這是我可能會用於查詢語法的一種情況。來自[MSDN](http://msdn.microsoft.com/zh-cn/library/bb397676.aspx):'通常,當您編寫LINQ查詢時,我們建議您儘可能使用查詢語法,並在需要時使用方法語法。' –

+1

我喜歡JOIN的這種形式。對於「Lambda表達式」,它需要指定4個參數(加上接收器),儘管與上述相同,但看起來更加混亂。 – 2012-12-03 21:30:31

+0

雖然查詢語法對連接更容易,但lambda語法更易於調試。詳情請參閱https://www.simple-talk.com/dotnet/.net-framework/linq-secrets-revealed-chaining-and-debugging/ – Roger

回答

15

我更喜歡Joins的「LINQ語法」,因爲我認爲它看起來更乾淨。

在任何情況下,以下是如何將LINQ連接轉換爲「Lambda表達式」加入。

翻譯爲:

from a in AA 
join b in BB on 
a.Y equals b.Y 
select new {a, b} 

是:

AA.Join(    // L 
    BB,     // R 
    a => a.Y, b => b.Y // L -> join value, R -> join value 
    (a, b) => new {a, b}) // L+R result 

其他LINQ關鍵字更加簡單轉換(如OrderBy(u => u.DisplayOrder)和只是 「鏈接在一起」 與. - 給它一個。去吧!

+0

@ user166390這有助於。 – User

+0

我認爲你錯過了b => b.Y和(a,b)=> new {a,b}之間的逗號,我在這裏可能是錯的。 – WizardHammer

6
var responses = questionRepository.GetReponses() 
        .Join(questionRepository.GetQuestions(), 
         c => c.QuestionID 
         o => o.QuestionID 
         (c, o) => new {c, o}) 
        .Where(x => x.c.UserID == 99999) 
        .OrderBy(x => x.o.DisplayOrder) 
        .Select(x => new {x.o.QuestionText, x.c.AnswerValue}); 
+2

感謝這有助於。 – User