2012-12-03 9 views
7

Dường như hầu hết LINQ được viết bằng các biểu thức lambda. Làm thế nào để tôi đi về viết lại linq này bằng cách sử dụng lambda, kinda nhầm lẫn với phong cách (đặc biệt là với gia nhập)?Làm thế nào để viết lại LINQ này bằng cách sử dụng tham gia với các biểu thức lambda?

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

Bạn không thực sự cần phải viết lại nó. Thật là tốt khi nói thật. etimes tôi sử dụng một phong cách và đôi khi khác, và đây là một trường hợp mà tôi có thể đi cho cú pháp truy vấn. Từ [MSDN] (http://msdn.microsoft.com/en-us/library/bb397676.aspx): 'Là quy tắc khi bạn viết các truy vấn LINQ, chúng tôi khuyên bạn nên sử dụng cú pháp truy vấn bất cứ khi nào có thể và cú pháp phương thức bất cứ khi nào cần thiết .' –

+1

Tôi thích biểu mẫu này cho JOIN. Với "Biểu thức Lambda", nó yêu cầu chỉ định 4 đối số (cộng với bộ thu), trong khi giống như ở trên, có vẻ lộn xộn hơn. –

+0

Mặc dù cú pháp truy vấn dễ dàng hơn cho các phép nối, cú pháp lambda dễ debug hơn. Để biết chi tiết, hãy xem https://www.simple-talk.com/dotnet/.net-framework/linq-secrets-revealed-chaining-and-debugging/ – Roger

Trả lời

15

Tôi thích "LINQ cú pháp" cho tham gia như tôi nghĩ rằng nó trông sạch hơn.

Trong mọi trường hợp, đây là cách dịch LINQ-join thành "Lambda Expression" -join.

Bản dịch cho:

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

là:

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 

Các từ khóa LINQ khác là đơn giản hơn nhiều để chuyển đổi (ví dụ OrderBy(u => u.DisplayOrder) và chỉ là "xích lại với nhau" với . - cho nó một. hãy đi!

+0

@ user166390 điều này đã giúp ích. – User

+0

Tôi nghĩ rằng bạn đang thiếu dấu phẩy giữa b => b.Y và (a, b) => mới {a, b} Tôi mới ở đây tôi có thể sai. – 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

Cảm ơn điều này đã giúp. – User