何时更喜欢用SelectMany()表示的连接超过Linq中用join关键字表示的连接

时间:2010-10-26 16:46:19

标签: linq join

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是有目的的, 与其他风格相比,它具有一种风格性能优势吗?

2 个答案:

答案 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的变体,单个键有多个值)来查找匹配值。