2012-12-03 5 views
7

Es scheint, dass die meisten LINQ mit Lambda-Ausdrücken geschrieben wird. Wie gehe ich über das Umschreiben dieser Linq mit Lambda, ein bisschen Verwirrung mit dem Stil (vor allem mit Joins) gehen?Wie umschreiben Sie diese LINQ mit Join mit Lambda-Ausdrücke?

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

Sie müssen nicht wirklich umschreiben es ist gut, wie es ist, um ehrlich zu sein Manchmal benutze ich einen Stil und manchmal den anderen, und das ist ein Fall, wo ich wahrscheinlich für die Abfragesyntax gehen würde. Von [MSDN] (http://msdn.microsoft.com/en-us/library/bb397676.aspx): 'In der Regel wird beim Schreiben von LINQ-Abfragen empfohlen, wann immer möglich die Abfragesyntax zu verwenden und bei Bedarf die Methodensyntax zu verwenden .' –

+1

Ich mag dieses Formular für JOIN's. Bei "Lambda Expressions" müssen 4 Argumente angegeben werden (plus dem Empfänger), die, obwohl sie die gleichen wie oben sind, unübersichtlicher erscheinen. –

+0

Obwohl die Abfragesyntax für Joins einfacher ist, ist die Lambda-Syntax leichter zu debuggen. Für Details siehe https://www.simple-talk.com/dotnet/.net-framework/linq-secrets-revealed-chaining-and-debugging/ – Roger

Antwort

15

Ich bevorzuge die "LINQ-Syntax" für Joins, da ich denke, dass es sauberer aussieht.

In jedem Fall, hier ist, wie die LINQ-Join auf die "Lambda Expression" -join übersetzen.

Die Übersetzung für:

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

ist:

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 

Die anderen LINQ Schlüsselwörter sind viel einfacher zu konvertieren (zB OrderBy(u => u.DisplayOrder) und nur "aneinander gekettet" sind mit . - geben ihm eine. gehen Sie!

+0

@ user166390 dies half. – User

+0

Ich glaube, du vermisst ein Komma zwischen b => b.Y und (a, b) => neu {a, b} Ich neu hier könnte ich falsch liegen. – 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

Danke, das hat geholfen. – User