SELECT A.X, B.Y
FROM A JOIN B ON A.X = B.Y
Этот вызов метода linq (для соединения) будет генерировать вышеупомянутое соединение.
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
Эти вызовы методов linq (для GroupJoin, SelectMany, DefaultIfEmpty) приведут к вышеприведенному левому соединению
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.
);
Ключевой концепцией здесь является то, что методы Линка дают результаты иерархической формы, а не сплющенные формы строк-столбцов.
- Линк
GroupBy
создает результаты в виде иерархии с ключом группировки, соответствующим коллекции элементов (которые могут быть не пустыми). Предложение SQL GroupBy
создает ключ группировки с агрегированными значениями - нет подмножества для работы.
- Аналогично,
GroupJoin
Линка создает иерархическую форму - родительскую запись, сопоставленную с коллекцией дочерних записей (которая может быть пустой). * Sql LEFT JOIN
создает родительскую запись, соответствующую каждой дочерней записи, или нулевую дочернюю запись, если других совпадений нет. Чтобы получить форму Sql из формы Linq, необходимо распаковать коллекцию дочерних записей с помощью SelectMany
- и обработать пустые коллекции дочерних записей с помощью DefaultIfEmpty
.
И вот моя попытка связать этот sql в вопросе:
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 }