SELECT A.X, B.Y
FROM A JOIN B ON A.X = B.Y
这个 Linq 方法调用(Join)将生成上述的 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
使用这些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.
);
这里的关键概念是,Linq的方法产生层级形状的结果,而不是扁平的行列形状。
- Linq的
GroupBy
方法生成层次结构的结果,其中分组键匹配到一个元素集合(可能不为空)。SQL的GroupBy
子句生成带聚合值的分组键 - 没有子集合可用。
- 同样,Linq的
GroupJoin
方法生成层次结构的形状 - 一个父记录与一组子记录(可能为空)相匹配。Sql的LEFT JOIN
将一个父记录与每个子记录匹配,如果没有其他匹配,则将其设为null的子记录。要从Linq的形状转换到Sql的形状,必须使用SelectMany
拆开子记录的集合,并使用DefaultIfEmpty
处理空的子记录集合。
以下是将sql语句转换为Linq的尝试:
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 }