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方法调用(以群组加入,的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
会生成与每个子记录匹配的父记录,如果没有其他匹配,则生成空子记录。为了从Linq的形状中获得Sql的形状,必须使用SelectMany
解开子集记录集合,并使用DefaultIfEmpty
处理空记录子集记录。
而且这里是我在linquifying的尝试,在这个问题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 }
您是否在使用Linq to SQL? – 2009-06-18 14:41:45