14 Stimmen

Was ist der Unterschied zwischen LINQ-Abfrageausdrücken und Erweiterungsmethoden?

Nachfolgend finden Sie zwei Abfragen, die die gleichen Daten liefern. Abgesehen vom Stil bin ich mir nicht sicher, welche besser ist.

Welche Faktoren beeinflussen diese Abfragen? Welche Vorteile hat die Verwendung des einen Stils gegenüber dem anderen?

Muster 1

var x = from s in db.Surveys
    join sq in db.Survey_Questions on s.ID equals sq.Survey_ID
    join q in db.Questions on sq.Question_ID equals q.ID
    join qg in db.Question_Groups on q.ID equals qg.Question_ID
    where s.Type_ID.Equals(typeID) & s.Type.Equals(type)
    select new { question = sq.Question, status = sq.Status, grp = qg };

Beispiel 2

var x = db.Surveys.Where(s => s.Type_ID.Equals(typeID) & s.Type.Equals(type))
              .Join(db.Survey_Questions,
                        s => s.ID,
                        sq => sq.Survey_ID,
                        (s, sq) => new
                        {
                            question = sq.Question,
                            status = sq.Status
                        })
              .Join(db.Question_Groups,
                        q => q.question.ID,
                        qg => qg.Question_ID,
                        (q, qg) => new
                        {
                            question = q.question,
                            status = q.status,
                            group = qg
                        }).ToList();

0 Stimmen

Es ist erwähnenswert, dass Ihre Proben nicht identisch sind ...

0 Stimmen

Auch das .ToList() am Ende erzwingt eine ganz andere Ausführung. Lassen Sie es weg, um sie gleichwertig zu machen. Das erste x ist vom Typ IQueryable<T> und das zweite ist IList<T>.

1voto

Ihr Muster1 ist die Top-Level-Darstellung von Linq, sie ist besser lesbar, und beim Kompilieren wird sie in einen Ausdrucksbaum umgewandelt, d.h. Ihre Muster2 .

var x = from s in db.Surveys
    join sq in db.Survey_Questions on s.ID equals sq.Survey_ID
    join q in db.Questions on sq.Question_ID equals q.ID
    join qg in db.Question_Groups on q.ID equals qg.Question_ID
    where s.Type_ID.Equals(typeID) & s.Type.Equals(type)
    select new { question = sq.Question, status = sq.Status, grp = qg };

Sie können den folgenden Code ausprobieren, um einen Ausdruck für eine schriftliche Abfrage zu erhalten

var exp=x.Expression;

Ausdrücke werden verwendet, wenn die Abfrage weniger kompliziert ist

0voto

Chris Punkte 6544

Ich denke, Ihre Frage sollte besser so formuliert werden: "Was ist der Unterschied zwischen IEnumerable<T> und IQueryable<T> in Bezug auf LINQ".

LINQ-Abfragen geben standardmäßig ein IQueryable<T> zurück. IQueryable<T> ermöglicht es Ihnen, andere Filter oder "Klauseln" an Ihre Abfrage anzuhängen, bevor Sie sie ausführen.

Ihre LINQ-Abfrage (erstes Beispiel) und Ihre LINQ-Methodenverkettung (zweites Beispiel) liefern dasselbe Ergebnis, allerdings mit unterschiedlicher Syntax.

Es ist möglich, eine LINQ-Abfrage als LINQ-Methodenkette zu schreiben und umgekehrt. Es hängt wirklich von Ihrer Präferenz ab.

@Lucas: Der Unterschied ist, dass IEnumerable<T> eine In-Memory-Abfrage durchführt und IQueryable<T> eine Out-of-Memory-Abfrage. Das heißt, sobald man sich in einer foreach Iterator, verwenden Sie IEnumerable, und wenn Sie Ihre Abfrage erstellen, entweder über Erweiterungsmethoden oder mit LINQ from o in object synatax, bauen Sie ein IQueryable<T>. Das IQueryable<T> wird ausgeführt, sobald Sie den Enumerator berühren.

0 Stimmen

"LINQ-Abfragen geben standardmäßig ein IQueryable<T> zurück." Sie meinen LINQ to SQL oder LINQ to Entities. LINQ to Objects verwendet IEnumerable.

0 Stimmen

"IQueryable<T> ermöglicht es Ihnen, andere Filter oder "Klauseln" an Ihre Abfrage anzuhängen, bevor Sie sie ausführen. Das gilt auch für IEnumerable.

0 Stimmen

Oh und der Titel der Frage wurde korrigiert :)

0voto

Justin Punkte 2918

Ein weiterer erwähnenswerter Punkt ist, dass die Linq-Erweiterungsmethoden sich an die C#-Sprache halten, während das Abfrageverständnis vorverarbeitet wird, wie es im Compiler eingebaut ist. d.h. man kann zur Definition von .Select(x =>) navigieren navigieren, während dies bei from ... where ... select

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X