Linq允许使用join关键字或使用表达内部联接 SelectMany()(即来自关键字的几个)带有where关键字:
var personsToState = from person in persons
join state in statesOfUS
on person.State equals state.USPS
select new { person, State = state.Name };
foreach (var item in personsToState)
{
System.Diagnostics.Debug.WriteLine(item);
}
// The same query can be expressed with the query operator SelectMany(), which is
// expressed as two from clauses and a single where clause connecting the sequences.
var personsToState2 = from person in persons
from state in statesOfUS
where person.State == state.USPS
select new { person, State = state.Name };
foreach (var item in personsToState2)
{
System.Diagnostics.Debug.WriteLine(item);
}
我的问题:何时使用join-style以及何时使用where-style是有目的的, 与其他风格相比,它具有一种风格性能优势吗?
答案 0 :(得分:6)
对于本地查询Join
由于其键控查找为Athari mentioned而更有效,但是对于LINQ to SQL(L2S),您将获得SelectMany
以外的更多里程。在L2S中,SelectMany
最终在生成的SQL中使用某种类型的SQL连接,具体取决于您的查询。
看一下问题11&约瑟夫/本阿尔巴哈里的the LINQ Quiz中的12个,C#4.0的作者。它们显示了不同类型连接的样本,并指出:
使用LINQ to SQL,基于SelectMany 联接是最灵活的,可以 执行equi和non-equi连接。 抛出DefaultIfEmpty,你可以 做左外连接!
此外,Matt Warren在此主题上有一篇详细的博客文章,因为它与IQueryable
/ SQL有关:LINQ: Building an IQueryable provider - Part VII。
回到您要使用的问题,您应该使用更具可读性的查询,并让您轻松表达自己并清楚地构建您的最终目标。除非您正在处理大型集合并且已经分析了这两种方法,否则性能不应该是最初的关注点。在L2S中,您必须考虑SelectMany
为您提供的灵活性,具体取决于您配置数据所需的方式。
答案 1 :(得分:2)
Join更高效,它使用Lookup类(Dictionary的变体,单个键有多个值)来查找匹配值。