Frage

ich mit der folgenden SQL-Abfrage arbeite:

SELECT 
a.AppointmentId,
a.Status,
a.Type,
a.Title,
b.Days,
d.Description,
e.FormId
FROM Appointment a (nolock)
LEFT JOIN AppointmentFormula b (nolock)
ON a.AppointmentId = b.AppointmentId and b.RowStatus = 1
JOIN Type d (nolock)
ON a.Type = d.TypeId
LEFT JOIN AppointmentForm e (nolock)
ON e.AppointmentId = a.AppointmentId
WHERE a.RowStatus = 1
AND a.Type = 1
ORDER BY a.Type

Ich bin nicht sicher, wie die Joins in LINQ zu erreichen. Alle meine Tabellen haben Fremdschlüsselbeziehungen.

War es hilfreich?

Lösung

Sie können dies leicht zwicken, wie ich die Manschette abgehend wurde, aber es gibt ein paar wichtige Dinge im Auge zu behalten. Wenn Sie Ihre Beziehungen richtig in Ihrem dbml einrichten, sollten Sie in der Lage sein Innen zu tun schließt sich implizit und Zugriff auf die Daten einfach durch Ihre ursprüngliche Tabelle. Außerdem schließt sich links in LINQ sind nicht so einfach wie wir hoffen können, und Sie müssen gehen durch die DefaultIfEmpty Syntax, um es geschehen zu lassen. Ich habe einen anonymen Typ hier, aber Sie können in eine DTO-Klasse oder etwas in diesem Sinne setzen wollen. Ich wusste auch nicht, was Sie im Fall von nulls tun wollten, aber Sie können die verwenden ?? Syntax einen Wert zu definieren, um die Variable zu geben, wenn der Wert null ist. Lassen Sie mich wissen, wenn Sie weitere Fragen haben ...

var query = (from a in context.Appointment
join b in context.AppointmentFormula on a.AppointmentId equals b.AppointmentId into temp
from c in temp.DefaultIfEmpty()
join d in context.AppointmentForm on a.AppointmentID equals e.AppointmentID into temp2
from e in temp2.DefaultIfEmpty()
where a.RowStatus == 1 && c.RowStatus == 1 && a.Type == 1
select new {a.AppointmentId, a.Status, a.Type, a.Title, c.Days ?? 0, a.Type.Description, e.FormID ?? 0}).OrderBy(a.Type);

Andere Tipps

SELECT A.X, B.Y
FROM A JOIN B ON A.X = B.Y

Dieser Linq Methodenaufruf (Join) generiert die oben Join.

var query = A.Join
(
  B,
  a => a.x,
  b => b.y,
  (a, b) => new {a.x, b.y} //if you want more columns - add them here.
);

SELECT A.X, B.Y
FROM A LEFT JOIN B ON A.X = B.Y

Diese Linq Methodenaufrufe (bis GroupJoin, Select, DefaultIfEmpty) produzieren die oben LEFT JOIN

var query = A.GroupJoin
(
  B,
  a => a.x,
  b => b.y,
  (a, g) => new {a, g}
).SelectMany
(
  z => z.g.DefaultIfEmpty(),
  (z, b) =>
    new  { x = z.a.x, y = b.y } //if you want more columns - add them here.
);

Das Schlüsselkonzept ist hier, dass Linq Methoden hierarchisch förmigen Ergebnisse, nicht Zeilen-Spalten-Formen abgeflacht.

  • Linq des GroupBy produziert in einer Hierarchie mit einer Gruppierungsschlüssel förmigen Ergebnisse abgestimmt auf eine Sammlung der Elemente (die nicht leer sein kann). SQL ist GroupBy Klausel erzeugt einen Gruppierungsschlüssel mit aggregierten Werten -. Gibt es keine Untersammlung mit arbeiten
  • In ähnlicher Weise erzeugt Linq der GroupJoin eine hierarchische Form - einen übergeordneten Datensatz zu einer Sammlung angepasst der Kinderaufzeichnungen (die leer sein kann). SQLs LEFT JOIN erzeugt einen übergeordneten Datensatz für jedes Kind Datensatz angepasst oder ein Null-Kind Rekord, wenn es keine anderen Spiele sind. Um Form SQLs Form von Linq ist, muss man die Sammlung von untergeordneten Datensatz mit SelectMany entpacken -. Und befaßt sich mit leeren Sammlungen von Kindern Aufzeichnungen mit DefaultIfEmpty

Und hier ist mein Versuch, linquifying dass SQL in der Frage:

var query =
  from a in Appointment
  where a.RowStatus == 1
  where a.Type == 1
  from b in a.AppointmentFormula.Where(af => af.RowStatus == 1).DefaultIfEmpty()
  from d in a.TypeRecord //a has a type column and is related to a table named type, disambiguate the names
  from e in a.AppointmentForm.DefaultIfEmpty()
  order by a.Type
  select new { a.AppointmentId, a.Status, a.Type, a.Title, b.Days, d.Description, e.Form }

Wenn Sie die (NOLOCK) Hinweise erhalten will, muss ich gebloggt eine praktische Lösung mit Erweiterungsmethoden in C #. Beachten Sie, dass dies ist das gleiche wie das Hinzufügen nolock Hinweise zu jeder Tabelle in der Abfrage.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top